我正在 TabBarView 中编写相机页面,并尝试使用功能 _obtainCamera()设置相机控制器,然后再运行由 FutureBuilder 。
问题在于,似乎 FutureBuilder 在 _obtainCamera()完成之前就已构建,并且快照始终永远在加载屏幕上。
奇怪的是,如果我从代码中删除 _obtainCamera(),再次将其粘贴并执行热重装,就会看到摄像机的视图。我不确定是否以错误的方式设置了FutureBuilder或什么?我认为这是执行顺序的问题,但我不知道如何在 build()
之前确保功能的完整性。 @override
void initState() {
super.initState();
_obtainCamera();
}
Future<void> _obtainCamera() async {
_cameraList = await availableCameras();
firstCamera = await _cameraList.first;
_controller = CameraController(
firstCamera,
ResolutionPreset.medium,
);
_initializeControllerFuture = _controller.initialize();
}
...
@override
Widget build(BuildContext context) {
return Stack(children: [
Container(
child: FutureBuilder<void>(
future: _initializeControllerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// If the Future is complete, display the preview.
debugPrint('done');
return CameraPreview(_controller);
} else {
// Otherwise, display a loading indicator.
debugPrint('not done');
return Center(child: CircularProgressIndicator());
}
},
),
),
FloatingActionButton(
child: Icon(Icons.camera_alt),
// Provide an onPressed callback.
onPressed: () {},
)
]);
}
答案 0 :(得分:1)
使用此代码包装代码;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback(
(_) {
_obtainCamera();
},
);
}
答案 1 :(得分:1)
是的,这里的问题是因为您调用了控制器的初始化程序而不是调用了自己的未来, 所以你看到这是错误的需求
要解决此问题,您可以做两件事
1-修改Future并直接在FutureBuilder中使用
或
2-在构建窗口小部件之前调用您的InitState中的Future来设置控制器
确保在initState中添加带有异步的等待状态
如果不起作用,请使用didChangeDependances