我是Flutter和Dart的新手,我正在尝试使用Camera Plugin来了解事情是如何运作的。我发现的所有例子都有这个部分:
Array
(
[1] => Array
(
[0] => A
)
[2] => Array
(
[0] => B
[1] => C
)
[3] => Array
(
[0] => D
[1] => E
[2] => F
[3] => G
)
[4] => Array
(
[0] => H
[1] => I
[2] => J
[3] => K
[4] => L
[5] => M
[6] => N
[7] => O
)
)
我有什么方法可以在List<CameraDescription> cameras;
Future<Null> main() async {
cameras = await availableCameras();
runApp(new CameraApp());
}
方法中执行此操作吗?我想这也是关于运行initState()
- 方法之前所需的异步工作的更普遍的问题。 (因为initState
- 方法不能是异步的。)
我的目标是创建一个initState
,其中包含来自相机的供稿,该供稿来自其他文件。这是我到目前为止所拥有的。任何帮助表示赞赏!
StatefulWidget
答案 0 :(得分:5)
您无法在async
中initState
工作,但您可以启动其他功能中完成的异步工作,然后在完成setState
通话后发出信号。使用await
,您可以确保以正确的顺序设置摄像机和控制器。最后调用setState将确保在最后重建窗口小部件,您可以在任何地方传递初始化的摄像头控制器。
class _CameraState extends State<CameraWidget> {
List<CameraDescription> cameras;
CameraController controller;
bool _isReady = false;
@override
void initState() {
super.initState();
_setupCameras();
}
Future<void> _setupCameras() async {
try {
// initialize cameras.
cameras = await availableCameras();
// initialize camera controllers.
controller = new CameraController(cameras[0], ResolutionPreset.medium);
await controller.initialize();
} on CameraException catch (_) {
// do something on error.
}
if (!isMounted) return;
setState(() {
_isReady = true;
});
}
Widget build(BuildContext context) {
if (!_isReady) return new Container();
return ...
}
}
您还希望确保处理任何错误,该程序包包含CameraException
,当特定于平台的代码失败时会引发该错误。