有问题的小部件是:上传器构建函数绝不能返回 null

时间:2021-03-07 19:28:15

标签: firebase flutter dart google-cloud-firestore flutter-dependencies

我想要做的是从画廊/相机中挑选图像,然后将其存储在 Firebase 存储中。 单击相机/图库后,我可以选择图像,但是当我尝试上传它时,会显示以下错误。它也显示在模拟器的屏幕上。 错误和代码如下。

错误:

The following assertion was thrown building Uploader(dirty, state: _UploaderState#8962b):
A build function returned null.

The offending widget is: Uploader
Build functions must never return null.

To return an empty space that causes the building widget to fill available room, return "Container()". To return an empty space that takes as little room as possible, return "Container(width: 0.0, height: 0.0)".

The relevant error-causing widget was: 
  Uploader file:///Users/yassinezagliz/AndroidStudioProjects/dekra/lib/screens/auth/widgets/box.dart:94:13
When the exception was thrown, this was the stack: 
#0      debugWidgetBuilderValue.<anonymous closure> (package:flutter/src/widgets/debug.dart:302:7)
#1      debugWidgetBuilderValue (package:flutter/src/widgets/debug.dart:323:4)
#2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4632:7)
#3      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
#4      Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)

我的代码是:

import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
import 'package:flutter/foundation.dart';


class Box extends StatefulWidget {
  @override
  _BoxState createState() => _BoxState();

}

class _BoxState extends State<Box>{

  File _imageFile;


//Select an image via gallery or camera
  Future<void> _pickImage(ImageSource source) async {
    // ignore: deprecated_member_use
    File selected = await ImagePicker.pickImage(source: source);

    setState(() {
      _imageFile = selected;
    });
  }

//Remove image
  void _clear() {
    setState(() => _imageFile = null);
  }

  //Crop Image
  Future<void> _cropImage() async {
    File cropped = await ImageCropper.cropImage(
      sourcePath: _imageFile.path,
      //toolbarColor: Colors.purple,
      //toolbarWidgetColor: Colors.white,
      //toolbarTitle: 'Crop It'
    );

    setState(() {
      _imageFile = cropped ?? _imageFile;
    });
  }



  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.pink.shade100,
      appBar: new AppBar(
      title:  new Text("Box Photos"),
      backgroundColor: Colors.pink.shade100,
      ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          children: <Widget>[
            IconButton(
              icon: Icon(Icons.photo_camera),
              onPressed: () => _pickImage(ImageSource.camera),
            ),

            IconButton(
              icon: Icon(Icons.photo_library),
              onPressed: () => _pickImage(ImageSource.gallery),
            ),
          ],
        ),
      ),

      body: ListView(
        children: <Widget>[
          if (_imageFile != null) ...[
            Image.file(_imageFile),

            Row(
              children: <Widget>[
                FlatButton(
                    onPressed: _cropImage,
                    child: Icon(Icons.crop)
                ),
                FlatButton(
                    onPressed: _clear,
                    child: Icon(Icons.refresh)
                ),
              ],
            ),

被异常选中的行: Uploader(file: _imageFile) => box.dart:94:13

            Uploader(file: _imageFile)
          ]
        ],
      ),
    );


  }

}

class Uploader extends StatefulWidget {

  final File file;

  Uploader({Key key, this.file}) : super(key: key);
  createState() => _UploaderState();
}

class _UploaderState extends State<Uploader> {

  final FirebaseStorage _storage =
  // ignore: deprecated_member_use
  FirebaseStorage(storageBucket: 'gs://dekra-c50a1.appspot.com');

  UploadTask _uploadTask;

  void _startUpload() {
    String filePath = 'images/${DateTime.now()}.png';

    setState(() {
      _uploadTask = _storage.ref().child(filePath).putFile(widget.file);
    });
  }


  @override
  Widget build(BuildContext context) {

  }
}

1 个答案:

答案 0 :(得分:1)

根据错误消息,我认为问题在于 build_UploaderState 方法没有返回小部件。你至少应该返回一个空的容器:

@override
Widget build(BuildContext context) {
  return Container();
}