Функция сборки вернула значение null. Нарушающий виджет: StoryCamera

#flutter #null #builder #flutter-navigation

#flutter #null #Конструктор #flutter-навигация

Вопрос:

Я пытаюсь отобразить полное отображение камеры на этой странице, и когда я запускаю его, он возвращает значение null. Это моя первая попытка создать страницу камеры, чтобы все выглядело повсеместно.

StoryCamera.dart

 import 'dart:async';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

List<CameraDescription> cameras;
//CameraController controller;

class StoryCamera extends StatefulWidget {
  final String currentUser;

  StoryCamera({this.currentUser});
  @override
  _StoryCameraState createState() => _StoryCameraState();
}

class _StoryCameraState extends State<StoryCamera> {
  CameraController _controller;
  Future<void> _initializeControllerFuture;
  bool isCameraReady = false;
  bool showCapturedPhoto = false;
  var ImagePath;

  get pageStatus => 1;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<void> _initializeCamera() async {
    final cameras = await availableCameras();
    final firstCamera = cameras.first;
    _controller = CameraController(firstCamera, ResolutionPreset.high);
    _initializeControllerFuture = _controller.initialize();
    if (!mounted) {
      return Container();
    }
    setState(() {
      isCameraReady = true;
    });
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      _controller != null
          ? _initializeControllerFuture = _controller.initialize()
          : null; //on pause camera is disposed, so we need to call again "issue is only for android"
    }
  }

  void onCaptureButtonPressed() async {
    //on camera button press
    try {
      final path = join(
        (await getTemporaryDirectory()).path, //Temporary path
        '$pageStatus${DateTime.now()}.png',
      );
      ImagePath = path;
      await _controller.takePicture(path); //take photo

      setState(() {
        showCapturedPhoto = true;
      });
    } catch (e) {
      print(e);
    }
  }

  @override
  void dispose() {
    _controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    final deviceRatio = size.width / size.height;

    FutureBuilder<void>(
      future: _initializeControllerFuture,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          // If the Future is complete, display the preview.
          return Stack(
            children: <Widget>[
              Center(
                child: Transform.scale(
                  scale: _controller.value.aspectRatio / deviceRatio,
                  child: new AspectRatio(
                    aspectRatio: _controller.value.aspectRatio,
                    child: new CameraPreview(_controller),
                  ),
                ),
              ),
            ],
          );
        } else {
          return Container(
              child:
                  CircularProgressIndicator()); // Otherwise, display a loading indicator.
        }
      },
    );
  }
}

  

Ошибка также указывает на страницу перед ней, которая перенаправляет вас на эту страницу.

Страница истории.dart

 Navigator.push(
      context,
      MaterialPageRoute(
       builder: (context) => StoryCamera())),
  

Кто-нибудь может сказать мне, почему это происходит?

Ответ №1:

Вам нужно добавить возврат

 return FutureBuilder<void>(
  

Комментарии:

1. Вау, так просто. Я не могу поверить, что пропустил это. Я только заглядывал внутрь FutureBuilder, чтобы убедиться, что возвраты были там.