我对“颤振”和“飞镖”都很陌生,我正在尝试使用照相机插件来理解事情是如何工作的。我发现的所有例子都有以下几个部分:
List<CameraDescription> cameras;
Future<Null> main() async {
cameras = await availableCameras();
runApp(new CameraApp());
}在initState()方法中有什么方法可以这样做吗?我想这也是一个关于运行initState-method之前所需的异步工作的更普遍的问题。(因为initState-method不能是异步的)。
我的目标是创建一个包含来自摄像机的提要的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();
}发布于 2018-04-04 00:10:10
您不能在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 (!mounted) return;
setState(() {
_isReady = true;
});
}
Widget build(BuildContext context) {
if (!_isReady) return new Container();
return ...
}
}您还需要确保处理任何错误,包中包含一个CameraException,当平台特定的代码失败时会抛出它。
https://stackoverflow.com/questions/49640723
复制相似问题