我对Flutter和Dart都是陌生的,并且我正在尝试使用Camera Plugin来了解事物的工作原理。我发现的所有示例都包含以下部分:
List<CameraDescription> cameras;
Future<Null> main() async {
cameras = await availableCameras();
runApp(new CameraApp());
}
有什么办法可以在
initState()
方法中执行此操作吗?我猜这也是关于在运行initState
-method之前需要进行的异步工作的一个更一般的问题。 (因为initState
-方法不能异步)。我的目标是创建一个
StatefulWidget
,其中包含来自相机的供稿,供其他文件使用。到目前为止,这就是我所拥有的。任何帮助表示赞赏! List<CameraDescription> cameras;
@override
void initState() {
super.initState();
getCameras();
controller = new CameraController(cameras[0], ResolutionPreset.medium);
controller.initialize().then( (_) {
if (!mounted) {
return;
}
setState(() {});
});
}
Future<Null> getCameras() async {
cameras = await availableCameras();
}
最佳答案
您不能在async
中完成initState
的工作,但是可以启动在其他函数中完成的异步工作,然后在完成setState
调用后发出信号。使用await
,可以确保以正确的顺序设置摄像机和 Controller 。最后调用setState将确保在最后重建小部件,您可以在任何地方传递初始化的相机 Controller 。
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 (!mounted) return;
setState(() {
_isReady = true;
});
}
Widget build(BuildContext context) {
if (!_isReady) return new Container();
return ...
}
}
您还需要确保处理任何错误,该程序包包含一个
CameraException
,当平台特定的代码失败时会抛出该ojit_code。关于dart - Flutter相机插件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49640723/