我是 Flutter 和 Dart 的新手,我正在尝试使用 Camera Plugin了解事物是如何运作的。我找到的所有示例都有这部分:
List<CameraDescription> cameras;
Future<Null> main() async {
cameras = await availableCameras();
runApp(new CameraApp());
}
有没有什么方法可以在 initState()
方法中做到这一点?我想这也是一个关于运行 initState
方法之前所需的异步工作的更普遍的问题。 (因为 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();
}
最佳答案
您不能在 initState
中执行 async
工作,但您可以在其他函数中启动异步工作,然后在完成时发出 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
,当特定于平台的代码失败时会抛出该异常。
关于dart - flutter 相机插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49640723/