[flutter] Riverpod를 사용하여 앱에 카메라 기능을 추가하는 방법은 어떻게 되나요?

Riverpod는 Flutter 앱에 상태 관리를 위한 시각적으로 강력한 도구입니다. 카메라 기능을 추가하기 위해서는 먼저 flutter_camera package를 사용할 것을 권장합니다. 이 패키지는 Flutter에서 카메라에 접근하여 이미지나 비디오를 촬영할 수 있는 기능을 제공합니다.

여기에는 Riverpod와 flutter_camera 패키지를 사용하여 앱에 카메라 기능을 추가하는 단계를 안내하겠습니다.

  1. 먼저 pubspec.yaml 파일에 flutter_camera 패키지를 추가합니다.
dependencies:
  flutter_camera: ^0.10.3
  1. 다음으로 flutter_camera 패키지를 가져올 수 있도록 main.dart 파일의 상단에 import 문을 추가합니다.
import 'package:flutter_camera/flutter_camera.dart';
  1. 이제 Riverpod를 사용하여 카메라 상태를 관리할 Provider를 생성합니다. 상태는 촬영한 사진의 경로를 저장할 수 있도록 설정합니다.
import 'package:flutter_riverpod/flutter_riverpod.dart';

final cameraProvider = Provider<Camera>((ref) => Camera());
final photoPathProvider = Provider<String>((ref) => '');
  1. 이제 화면에 카메라 미리 보기를 표시하기 위해 StatefulWidget를 생성합니다. initState에서 Provider로부터 camera 인스턴스를 가져옵니다.
class CameraPreviewScreen extends StatefulWidget {
  @override
  _CameraPreviewScreenState createState() => _CameraPreviewScreenState();
}

class _CameraPreviewScreenState extends State<CameraPreviewScreen> {
  Camera? _camera;

  @override
  void initState() {
    super.initState();
    _camera = context.read(cameraProvider);
  }

  @override
  void dispose() {
    _camera!.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Camera Preview'),
      ),
      body: Column(
        children: [
          Expanded(
            child: CameraPreview(_camera!),
          ),
          ElevatedButton(
            onPressed: () async {
              final photoPath = await _camera!.takePhoto();
              context.read(photoPathProvider).state = photoPath;
            },
            child: Text('Take Photo'),
          ),
        ],
      ),
    );
  }
}
  1. 마지막으로 앱의 메인 화면에서 CameraPreviewScreen 위젯을 표시합니다. 클릭 이벤트를 통해 화면을 전환하고, 촬영한 사진의 경로를 표시할 수 있도록 Provider를 사용하여 구현합니다.
void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final photoPath = context.read(photoPathProvider).state;

    return MaterialApp(
      title: 'Camera App',
      home: photoPath.isNotEmpty
          ? Scaffold(
              body: Center(
                child: Image.file(File(photoPath)),
              ),
            )
          : Scaffold(
              body: Center(
                child: ElevatedButton(
                  onPressed: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => CameraPreviewScreen(),
                      ),
                    );
                  },
                  child: Text('Open Camera'),
                ),
              ),
            ),
    );
  }
}

이제 앱을 실행하고 “Open Camera” 버튼을 클릭하면 카메라 미리 보기가 표시됩니다. 그리고 “Take Photo” 버튼을 클릭하면 촬영한 사진이 앱 화면에 표시됩니다.

이처럼 Riverpod와 flutter_camera를 사용하여 Flutter 앱에 간단하게 카메라 기능을 추가할 수 있습니다. 추가로 사진 촬영 후에 다른 동작을 실행하려면 Provider를 사용하여 촬영한 사진의 경로를 저장하고 해당 경로를 활용할 수 있습니다.

참고 자료: