코딩하는 제리

[Flutter/Project](Instagram Clone) 카메라 버튼 작동, 사진 파일 이름, 경로, 미리보기 본문

Flutter/Project_InstaClone(완)

[Flutter/Project](Instagram Clone) 카메라 버튼 작동, 사진 파일 이름, 경로, 미리보기

JerryCho 2021. 1. 30. 16:08

 


 

촬영 버튼 take_photo.dart
촬영 메서드 take_photo.dart
촬영 후 넘기는 화면 파일 share_post_screen.dart


소스코드 및 pubspec.yaml

path, path_provider 추가

// screens/share_post_screen.dart

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

class SharePostScreen extends StatelessWidget {
  final File imageFile;

  const SharePostScreen(this.imageFile, {Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Image.file(imageFile);
  }
}
// take_photo.dart

import 'dart:io';

import 'package:camera/camera.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_project_IJ/constants/screen_size.dart';
import 'package:flutter_project_IJ/models/camera_state.dart';
import 'package:flutter_project_IJ/screens/share_post_screen.dart';
import 'package:flutter_project_IJ/widgets/my_progress_indicator.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';

class TakePhoto extends StatefulWidget {
  const TakePhoto({
    Key key,
  }) : super(key: key);

  @override
  _TakePhotoState createState() => _TakePhotoState();
}

class _TakePhotoState extends State<TakePhoto> {
  Widget _progress = MyProgressIndicator();

  @override
  Widget build(BuildContext context) {
    return Consumer(
      builder: (BuildContext context, CameraState cameraState, Widget child) {
        return Column(
          children: [
            Container(
              color: Colors.black,
              height: size.height / 3 * 2,
              width: size.width,
              child: (cameraState.isReadyToTakePhoto)
                  ? _getPreview(cameraState)
                  : _progress,
            ),
            Expanded(
              child: OutlineButton(
                onPressed: () {
                  // 카메라 준비 확인.
                  if (cameraState.isReadyToTakePhoto) {
                    _attemptTakePhoto(cameraState, context);
                  }
                },
                shape: CircleBorder(),
                borderSide: BorderSide(
                  color: Colors.black12,
                  width: 20,
                ),
              ),
            )
          ],
        );
      },
    );
  }

  Widget _getPreview(CameraState cameraState) {
    return ClipRect(
      // OverflowBox로 넘어간 부분을 제거.
      child: OverflowBox(
        // BoxFit으로 맞춘 나머지 부분을 밖으로 넘어가게 함.
        alignment: Alignment.center,
        child: FittedBox(
          // 가로사이즈에 맞춤.
          fit: BoxFit.fitWidth,
          child: Container(
            width: size.width,
            height: size.height / 3 * 2,
            child: CameraPreview(cameraState.controller),
          ),
        ),
      ),
    );
  }

  void _attemptTakePhoto(CameraState cameraState, BuildContext context) async {
    final String timeInMilli = DateTime.now().millisecondsSinceEpoch.toString();
    try {
      // 이미지 저장 경로 및 파일이름
      // getTemporaryDirectory()).path -> 임시경로(path_provider)
      final path =
          join((await getTemporaryDirectory()).path, '$timeInMilli.png');
      // 사진 촬영
      await cameraState.controller.takePicture(path);

      File imageFile = File(path);
      // 사진 촬영 후 미리보기 화면으로 넘어감.
      Navigator.push(context,
          MaterialPageRoute(builder: (_) => SharePostScreen(imageFile)));
    } catch (e) {}
  }
}
Comments