我希望在 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
。
此代码示例由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();
}
}