为什么我在我的代码函数中收到此错误返回null?

问题描述:

为什么我的小部件会出现此错误?:

Why my widget give this error ?:

======== Exception caught by widgets library =======================================================
The following assertion was thrown building StreamBuilder<UserData>(dirty, state: _StreamBuilderBaseState<UserData, AsyncSnapshot<UserData>>#1e46f):
A build function returned null.

The offending widget is: StreamBuilder<UserData>
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: 
  StreamBuilder<UserData> file:///Users/name/StudioProjects/project/lib/seitenleiste/meinacount.dart:356:16
When the exception was thrown, this was the stack: 
#0      debugWidgetBuilderValue.<anonymous closure> (package:flutter/src/widgets/debug.dart:305:7)
#1      debugWidgetBuilderValue (package:flutter/src/widgets/debug.dart:326:4)
#2      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4592:7)
#3      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4759:11)
#4      Element.rebuild (package:flutter/src/widgets/framework.dart:4281:5)
...
====================================================================================================

这是我的小部件


  @override
  Widget build(BuildContext context) {
final user = Provider.of<Userr>(context);
        return StreamBuilder<UserData>(
          stream: DatbaseService(uid:user.uid).userData,
          builder: (context, snapshot) {
            if(snapshot.hasData){
              UserData userData =snapshot.data;
              return Container(
                child: Scaffold(
                  appBar: AppBar(
                    backgroundColor: Colors.transparent,
                    elevation: 0.0,
                  ),
                  body: AnnotatedRegion<SystemUiOverlayStyle>(
                    value: SystemUiOverlayStyle.light,
                    child: GestureDetector(
                      onTap: () => FocusScope.of(context).unfocus(),
                      child: Form(
                        key: _formKey,
                        child: Stack(
                          children: <Widget>[
                            Container(
                              height: double.infinity,
                              child: SingleChildScrollView(
                                physics: AlwaysScrollableScrollPhysics(),
                                padding: EdgeInsets.symmetric(
                                  horizontal: 40.0,
                                  vertical: 10,
                                ),
                                child: Column(
                                  mainAxisAlignment: MainAxisAlignment.center,
                                  children: <Widget>[
                                    Center(
                                      child: Stack(
                                        children: [
                                          Container(
                                            width: 110,
                                            height: 110,
                                            decoration: BoxDecoration(

                                                borderRadius: BorderRadius.circular(100),
                                                image: DecorationImage(
                                                    fit: BoxFit.cover,
                                                    image: NetworkImage(
                                                      "https://images.pexels.com/photos/3307758/pexels-photo-3307758.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=250",
                                                    ))),
                                          ),
                                          Positioned(
                                              bottom: 0,
                                              right: 0,
                                              child: Container(
                                                height: 35,
                                                width: 35,
                                                decoration: BoxDecoration(
                                                  shape: BoxShape.circle,
                                                  border: Border.all(
                                                    width: 4,
                                                    color: Theme.of(context)
                                                        .scaffoldBackgroundColor,
                                                  ),
                                                  color: Colors.green,
                                                ),
                                                child: Icon(
                                                  Icons.edit,
                                                  color: Colors.white,
                                                ),
                                              )),
                                        ],
                                      ),
                                    ),
                                    SizedBox(
                                      height: 10,
                                    ),
                                    Text(
                                      'Mein Profil',
                                      style: TextStyle(
                                        color: Colors.black,
                                        fontFamily: 'OpenSans',
                                        fontSize: 20.0,
                                        fontWeight: FontWeight.w600,
                                      ),
                                    ),
                                    showAlert2(),

                                      _buildEmailTF(userData),
                                    SizedBox(
                                      height: 30.0,
                                    ),
                                    _buildName(userData ),
                                    SizedBox(
                                      height: 30.0,
                                    ),
                                    _builduserName(userData),
                                    SizedBox(
                                      height: 30.0,
                                    ),
                                    _buildPasswordTF(userData),
                                    SizedBox(height: 30,),

                                    _buildPassword2TF(userData),
                                    _buildUpdateDataButton(),
                                    // _buildEmailform(),
                                  ],
                                ),
                              ),
                            )
                          ],
                        ),
                      ),
                    ),
                  ),

                ),
              );

            }else{
              return null;
            }

          }
        );


      }



错误消息非常简单:

The offending widget is: StreamBuilder<UserData>
Build functions must never return null.

StreamBuilder 中,如果 snapshot 没有数据,则返回 null :

In your StreamBuilder, you are returning null if the snapshot has no data:

@override
Widget build(BuildContext context) {
  final user = Provider.of<User>(context);
  return StreamBuilder<UserData>(
    stream: DatbaseService(uid: user.uid).userData,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        ...
      } else {
        return null;
      }
    },
  );
}

错误消息在此处提供了解决方案:

The error message is providing the solution here:

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)".

因此,与其返回 null ,不返回一个空的 Container :

So, instead of returning null, just return an empty Container:

@override
Widget build(BuildContext context) {
  final user = Provider.of<User>(context);
  return StreamBuilder<UserData>(
    stream: DatbaseService(uid: user.uid).userData,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
      } else {
        return Container();
      }
    },
  );
}