首页 > 解决方案 > iOS 在 Flutter 中实现相机

问题描述

我正在尝试为 android 和 iOS 设备在颤振中实现相机包,在 android 上我没有任何问题,但在 iOS 中我收到此错误:在构建 Builder 时抛出了以下 StateError:

Bad state: No element
When the exception was thrown, this was the stack: 
#0      List.first (dart:core-patch/growable_array.dart:332:5)
#1      _CameraState.initState (package:glass_case_flutter/controllers/camera_controller.dart:21:45)
#2      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4632:57)
#3      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4469:5)
...     Normal element mounting (24 frames)

这是 main.dart 的代码:

List<CameraDescription> cameras;

Future<Null> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  cameras = await availableCameras();
  await Firebase.initializeApp();
  runApp(GlassCase());
}

class GlassCase extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(fontFamily: 'Nunito'),
      initialRoute: WelcomeScreen.id,
      routes: {
        WelcomeScreen.id: (context) => WelcomeScreen(),
        RegistrationScreen.id: (context) => RegistrationScreen(),
        ResetPassword.id: (context) => ResetPassword(),
        HomeScreen.id: (context) => HomeScreen(cameras),
        ProfileScreen.id: (context) => ProfileScreen()
      },
    );
  }
}

这是我调用 camera.dart 的 homepage.dart 的代码:

IconButton(
          icon: Icon(Icons.camera_alt),
          onPressed: () {
            Navigator.push(
                context,
                MaterialPageRoute(
                    builder: (context) => Camera(widget.cameras)));
          },
          color: Colors.black,
        ),

这是我的camera.dart,很简单,打开相机即可:

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

class Camera extends StatefulWidget {
  List<CameraDescription> cameras;

  Camera(this.cameras);

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

class _CameraState extends State<Camera> {
  CameraController controller;
  @override
  void initState() {
    super.initState();
    controller =
        new CameraController(widget.cameras.first, ResolutionPreset.high);
    controller.initialize().then((_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (!controller.value.isInitialized) {
      return new Container();
    }
    return new AspectRatio(
      aspectRatio: controller.value.aspectRatio,
      child: CameraPreview(controller),
    );
  }
}

我在 Info.plist 中添加了这个来访问摄像头和麦克风:

    <key>NSCameraUsageDescription</key>
    <string>Enable to access your camera to capture your photo</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>Enable to access mic to record your voice</string>

我不明白为什么在 Android 中它可以工作,但在 iOS 中我得到了那个错误,有人可以帮助我吗?非常感谢 !

标签: androidiosfluttercamera

解决方案


推荐阅读