코딩하는 제리

[Flutter/Project](Instagram Clone) Provider를 이용한 카메라 상태관리1 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) Provider를 이용한 카메라 상태관리1

JerryCho 2021. 1. 29. 17:29


* 1. availableCamera 가져오기.
* 2. 카메라 리스트에서 첫번째 카메라 사용.
* 3. CameraController 인스턴스 생성.
* 4. CameraController initialize().
* 5. show preview.
* 6. set ready to take photo.


소스코드 및 pubspec.yaml

// models/camera_state.dart

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

/* 카메라 상태 파일 만들기
* 1. availableCamera 가져오기.
* 2. 카메라 리스트에서 첫번째 카메라 사용.
* 3. CameraController 인스턴스 생성.
* 4. CameraController initialize().
* 5. show preview.
* 6. set ready to take photo.
*/

class CameraState extends ChangeNotifier {
  CameraController _controller;
  CameraDescription _cameraDescription;

  // 카메라 준비 여부.
  bool _readyTakePhoto = false;

  void dispose() {
    // 해당 화면이 종료될 때, 초기값으로 설정.
    if (_controller != null) _controller.dispose();
    _controller = null;
    _cameraDescription = null;
    _readyTakePhoto = false;

    // 변경된 값을 consumer에게 알림
    notifyListeners();
  }
  
  void getReadyToTakePhoto() async {
    // 1. availableCamera 가져오기.
    // availableCameras는 future 타입이기에 async-await 사용
    List<CameraDescription> cameras = await availableCameras();

    // 사용 가능한 카메라 존재 여부
    if (cameras != null && cameras.isNotEmpty) {
      // 2. 카메라 리스트에서 첫번째 카메라 사용.
      setCameraDescription(cameras.first);
    }

    // initialize에 오류가 발생할 수 있음.
    // try-catch로 오류가 발생하면 false를 리턴하여
    // while을 못 빠져나가고 initialize()를 다시 실행.
    bool init = false;
    while (!init) {
      init = await initialize();
    }
    // initialize가 완료되면 true
    _readyTakePhoto = true;

    // consumer나 provier.of에게 변화를 알려줌.
    notifyListeners();
  }

  void setCameraDescription(CameraDescription cameraDescription) {
    _cameraDescription = cameraDescription;
    // 3. CameraController 인스턴스 생성.
    _controller =
        CameraController(_cameraDescription, ResolutionPreset.veryHigh);
  }

  // 4. CameraController initialize().
  Future<bool> initialize() async {
    try {
      // initialize -> future 타입
      await _controller.initialize();
      return true;
    } catch (e) {
      return false;
    }
  }

  // 데이터의 수정이 불가능하고 가져다 사용만 할 수 있음.
  CameraController get controller => _controller;
  CameraDescription get description => _cameraDescription;
  bool get isReadyToTakePhoto => _readyTakePhoto;
}

 

Comments