Я исправил. Я поместил инициализацию объекта камеры в родительский элемент виджета.
class _TakeReceiptPictureState extends State<TakeReceiptPicture> {
List<CameraDescription> cameras;
CameraDescription camera;
@override
void initState() {
super.initState();
availableCameras().then((availableCameras) {
cameras = availableCameras;
camera = cameras.first;
});
}
Затем сделал виджет, который делает снимок, параметром типа CameraDescription.
class PicturePreview extends StatefulWidget {
final CameraDescription camera;
const PicturePreview(this.camera, {Key key}) : super(key: key);
@override
_PicturePreviewState createState() => _PicturePreviewState();
}
Затем передал камеру, инициализированную в родительском виджете изображения
onTap: () {
Navigator.of(context).push(
PageTransition(
type: PageTransitionType.transferRight,
child: PicturePreview(camera)),
);
}),
, к моменту запуска метода сборки дочернего виджета объект камеры уже инициализирован и готов к go.
Сейчас состояние дочернего элемента имеет только две переменные: контроллер камеры и будущий контроллер инициализации.
CameraController cameraController;
Future<void> initializeController;
@override
void initState() {
super.initState();
cameraController = CameraController(
widget.camera,
ResolutionPreset.low,
);
initializeController = cameraController.initialize();
}
TL; DR: пусть за инициализацию объекта камеры отвечает родитель виджета.