gpt4 book ai didi

flutter - 如何等待相机初始化?

转载 作者:行者123 更新时间:2023-12-05 02:51:59 25 4
gpt4 key购买 nike

我一直从 camera.dart 收到错误消息,指出在空对象上调用了“name”。

一段时间后,我意识到问题出在我的 initstate 中的异步代码完成之前调用了 build 方法(实际上我有点自豪,我至少理解了这个问题:))

我尝试了很多不同的方法来正确初始化我的相机,但我做不到。这是我的代码的最后一次迭代。

处理这个 future 的惯用方式是什么?

  class _PicturePreviewState extends State<PicturePreview> {
List<CameraDescription> cameras;
CameraDescription camera;
CameraController cameraController;
Future<void> initializeController;

Future<void> getCameras() async {
try {
cameras = await availableCameras();
} catch(e) {print(e);}
camera = cameras.last;
print(camera);
}

@override
void initState() {
super.initState();
// getCameras();
availableCameras().then((availableCameras) {
cameras = availableCameras;
camera = cameras.first;
cameraController = CameraController(
camera,
ResolutionPreset.low,
);
initializeController = cameraController.initialize();
print(cameraController.value.isInitialized);
});

// cameraController = CameraController(
// camera,
// ResolutionPreset.low,
// );
// initializeController = cameraController.initialize();
// print(cameraController.value.isInitialized);
}

@override
void dispose() {
cameraController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<void>(
future: initializeController,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// If the Future is complete, display the preview.
return CameraPreview(cameraController);
}
else {
// Otherwise, display a loading indicator.
print(snapshot.connectionState);
return Center(child: CircularProgressIndicator());
}
},
),

我一直依赖this page使用相机包,但我无法逐字使用它,因为我无法继续将相机对象传递到我的小部件树中。

最佳答案

我修好了。我将相机对象的初始化放在小部件的父级中。

class _TakeReceiptPictureState extends State<TakeReceiptPicture> {
List<CameraDescription> cameras;
CameraDescription camera;

@override
void initState() {
super.initState();
availableCameras().then((availableCameras) {
cameras = availableCameras;
camera = cameras.first;
});
}

然后让拍照的widget有一个CameraDescription类型的参数。

class PicturePreview extends StatefulWidget {
final CameraDescription camera;
const PicturePreview(this.camera, {Key key}) : super(key: key);

@override
_PicturePreviewState createState() => _PicturePreviewState();
}

然后将parent中初始化的camera传递给图片widget

        onTap: () {
Navigator.of(context).push(
PageTransition(
type: PageTransitionType.transferRight,
child: PicturePreview(camera)),
);
}),

当子部件的构建方法运行时,相机对象已经初始化并准备就绪。

现在 child 的状态只有两个变量,相机 Controller 和初始化 Controller future 。

  CameraController cameraController;
Future<void> initializeController;

@override
void initState() {
super.initState();
cameraController = CameraController(
widget.camera,
ResolutionPreset.low,
);
initializeController = cameraController.initialize();
}

TLDR:让相机对象的初始化由小部件的父级负责。

关于flutter - 如何等待相机初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62848221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com