FLUTTER:如何将 main ( ) 函数中的变量使用到无状态小部件错误:未定义名称“faceCamera”?

问题描述 投票:0回答:1

我希望在 FLUTTER 中使用相机包,我对声明式编程还比较陌生,我能够在“main.dart”函数中创建一个初始化参数,如下所示:

Future <void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final cameras = await availableCameras();
  final faceCamera = cameras.first;
  runApp(
    const MyCameraApp(),
  );
}

然后在 main.dart 文件(应用程序的主页)内的无状态小部件中,我创建了一个

FloatingActionButton.extended()
,如下所示:

FloatingActionButton.extended(
                      onPressed: () {
                        Navigator.push(
                          context,
                          MaterialPageRoute(
                            builder: (context) => MyAppCameraPage(cameras: [faceCamera],),
                          ),
                        );
                      },

这可能是一个新手问题,但是我做错了什么会出现以下错误?

Undefined name 'faceCamera'

我的问题是:如何将此值传递到将使用相机预览的相机页面?通过这样做,我希望避免相机的实例化错误,该错误在应用程序启动时不会加载相机,并在我的测试设备的屏幕上显示“相机未加载”错误,使其完全红色且看起来很吓人。

对于上下文,这就是我的相机页面的有状态小部件实例化的样子:

class MyAppCameraPage extends StatefulWidget {
  MyAppCameraPage({super.key, required this.cameras});
  final List<CameraDescription> cameras;

  @override
  State<MyAppCameraPage> createState() => _MyAppCameraPageState();
}

所有相关包都已导入,因此没有错误。

任何有助于理解 FLUTTER 中基于声明式编程的帮助和有用的提示都会有所帮助。

我尝试将实例化变量声明为全局参数,就像 FLUTTER 团队在此处列出的包中所示的那样:Camera Package Flutter

并且,我尝试在相机页面本身中实例化相机,但这显然不起作用,因为相机必须在应用程序启动时初始化——这是我在声明性编码中仍然不完全理解的。

我还尝试将相机页面小部件创建为无状态,这样我可以更轻松地导入相机包并初始化,惊喜比我想象的更难做到。

我期望的是在

main()
函数中使用我在页面路由中声明的相机初始化后的局部变量
FloatingActionButton
,并避免在我的测试设备上弹出“相机未初始化的可怕错误”,并得到一个干净整洁
CameraPreview
。我的期望是达到问题中描述的
CameraPreview

flutter undefined flutter-dependencies flutter-camera
1个回答
0
投票

此代码示例由camera package

提供

但我不建议这样做。

// Global Variable
late List<CameraDescription> cameras;

Future <void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  cameras = await availableCameras();
  runApp(
    const MyCameraApp(),
  );
}

class MyAppCameraPage extends StatefulWidget {
  const MyAppCameraPage({super.key});

  @override
  State<MyAppCameraPage> createState() => _MyAppCameraPageState();
}

class _MyAppCameraPageState extends State<MyAppCameraPage> {

  final CameraDescription faceCamera = camera.first;

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

我更喜欢=>

class MyAppCameraPage extends StatefulWidget {
  const MyAppCameraPage({super.key});

  @override
  State<MyAppCameraPage> createState() => _MyAppCameraPageState();
}

class _MyAppCameraPageState extends State<MyAppCameraPage> {
  late final CameraDescription? faceCamera;

  Future<void> setAvaibleCamera() async {
    try {
      await availableCameras().then((value) {
        if (value != null && value.isNotEmpty) {
          faceCamera = value.first;
        }
      });
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.