Skip to content

Latest commit

 

History

History
237 lines (197 loc) · 4.58 KB

flutter-camera.md

File metadata and controls

237 lines (197 loc) · 4.58 KB

Flutter Camera

Flutter Camera no iOS

Instalando os pacotes

path:
camera:
path_provider:
uuid: ^2.0.4
image_crop: ^0.3.2

Inicializando os Widgets

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  if (Platform.isIOS) {
    runApp(IOSApp());
  } else {
    runApp(AndroidApp());
  }
}

Obtendo as câmeras disponíveis no Flutter

import 'package:camera/camera.dart';

takePicture() async {
    final cameras = await availableCameras();
    final firstCamera = cameras.first;

    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) => TakePictureView(
                camera: firstCamera,
            ),
        ),
    ).then((imagePath) {
        cropPicture(imagePath);
    });
}

Obtendo a câmera no Flutter

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:uuid/uuid.dart';

class TakePictureView extends StatefulWidget {
  final CameraDescription camera;

  const TakePictureView({
    Key key,
    @required this.camera,
  }) : super(key: key);

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

Inicializando a câmera no Flutter

CameraController _controller;
Future<void> _initializeControllerFuture;

@override
void initState() {
    super.initState();
    _controller = CameraController(
        widget.camera,
        ResolutionPreset.high,
    );

    _initializeControllerFuture = _controller.initialize();
}

@override
void dispose() {
    _controller.dispose();
    super.dispose();
}

Exibindo a imagem da câmera

...
FutureBuilder(
    future: _initializeControllerFuture,
    builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
            return CameraPreview(_controller);
        } else {
            return Center(
                child: CircularProgressIndicator(),
            );
        }
    },
),
...

Salvando a foto

...
Future<String> takePhoto() async {
    try {
        await _initializeControllerFuture;

        final uuid = Uuid();
        final fileName = '${uuid.v4()}.jpg';
        final path = join(
            (await getTemporaryDirectory()).path,
                fileName,
            );

        await _controller.takePicture(path);
        return path;
    } catch (ex) {
        print(ex);
        return "";
    }
}
...

Resultado final

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:uuid/uuid.dart';

class TakePictureView extends StatefulWidget {
  final CameraDescription camera;

  const TakePictureView({
    Key key,
    @required this.camera,
  }) : super(key: key);

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

class _TakePictureViewState extends State<TakePictureView> {
  CameraController _controller;
  Future<void> _initializeControllerFuture;

  @override
  void initState() {
    super.initState();
    _controller = CameraController(
      widget.camera,
      ResolutionPreset.high,
    );

    _initializeControllerFuture = _controller.initialize();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  Future<String> takePhoto() async {
    try {
      await _initializeControllerFuture;

      final uuid = Uuid();
      final fileName = '${uuid.v4()}.jpg';
      final path = join(
        (await getTemporaryDirectory()).path,
        fileName,
      );

      await _controller.takePicture(path);
      return path;
    } catch (ex) {
      print(ex);
      return "";
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Nova Imagem"),
        centerTitle: true,
        backgroundColor: Colors.transparent,
        elevation: 0,
      ),
      body: FutureBuilder(
        future: _initializeControllerFuture,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return CameraPreview(_controller);
          } else {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(
          Icons.camera,
        ),
        onPressed: () {
          takePhoto().then((path) {
            Navigator.pop(context, path);
          });
        },
      ),
    );
  }
}