简体   繁体   English

构建 function 返回 null。 Flutter Firebase

[英]A build function returned null. Flutter Firebase

I tried many things but couldn't get any workable solution, please help.我尝试了很多东西,但找不到任何可行的解决方案,请帮忙。 Even wit the FutureBuilder it doesn't seem to work and without it, I get the result when I hot reload.即使使用 FutureBuilder,它似乎也不起作用,没有它,我在热重载时得到结果。 I don't know how to change the code to make it work.我不知道如何更改代码以使其正常工作。 Probably there is something small missing, but I couldn't figure yet what it is or how to solve it.可能缺少一些小东西,但我还不知道它是什么或如何解决它。

"""import 'package:flutter/material.dart';
   import 'package:list/screens/add_new_item_screen.dart';
   import 'package:firebase_auth/firebase_auth.dart';
   import 'package:cloud_firestore/cloud_firestore.dart';

   final _firestore = Firestore.instance;
   FirebaseUser loggedinUser;

   Future<void> _fetchdata;


   FirebaseAuth _auth = FirebaseAuth.instance;

   class MainPage extends StatefulWidget {
     @override
     _MainPageState createState() => _MainPageState();
   }

   class _MainPageState extends State<MainPage> {
     void initState() {
       super.initState();

       _fetchdata = getCurrentUser();
     }

     Future<void> getCurrentUser() async {
       try {
  final user = await _auth.currentUser();
  if (user != null) {
    loggedinUser = user;
    // print(loggedinUser.email);
  }
} catch (e) {
  print(e);
       }
     }

     @override
     Widget build(BuildContext context) {
       return Scaffold(
         floatingActionButton: FloatingActionButton(
           onPressed: () {
             Navigator.push(
          context, MaterialPageRoute(
            builder: (context) => Addnewitem()));
    },
    child: Icon(Icons.add),
  ),
  appBar: AppBar(
    leading: Container(),
    title: Text("Shopping List"),
    actions: <Widget>[
      IconButton(
          icon: Icon(Icons.close),
          onPressed: () {
            // messagesStream();
            _auth.signOut();
            Navigator.pop(context);
          })
    ],
  ),
  body: SafeArea(child: 

      MessagesStream(),


         ),
       );
     }
   }

   class MessagesStream extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
       FutureBuilder(
         future: _fetchdata,
         builder: (context, myFuture){
           if (myFuture.connectionState == ConnectionState.done && !myFuture.hasError &&               myFuture.hasData) {
      if (myFuture.data != null) {

        return StreamBuilder<QuerySnapshot>(

    stream: _firestore
        .collection('users')
        .document(loggedinUser.uid)
        .collection('items')
        .snapshots(),
    builder: (context, snapshot) {
      if (!snapshot.hasData || snapshot.hasError || snapshot.data == null || snapshot.connectionState == ConnectionState.waiting || loggedinUser.email == null) {

        return (Center(
            child: CircularProgressIndicator(
                backgroundColor: Colors.lightBlueAccent)));
      }
      final items = snapshot.data.documents.reversed;
      List<MessageBubble> messageBubbles = [];
      for (var message in items) {
        final item = message.data['item'];

        final quant = message.data['quant'];
        final id = message.data['id'];
        final boli = message.data['bool'];

        // final currentUser = loggedinUser.email;

        final messageBubble = MessageBubble(
          text: item,
          quant: quant,
          documentReference: message.reference,
        );

        messageBubbles.add(messageBubble);
      }
      try {
      return Expanded(
        child: ListView(
          // reverse: true,
          padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
          children: messageBubbles,
        ),
      );
    } catch (e) {
      return Container();
      }
    });

      }else {
        return Container();
      }
    } else {
      return CircularProgressIndicator();
    }
  });
     }
   }

   class MessageBubble extends StatelessWidget {
     MessageBubble({this.text, this.quant, this.documentReference});

     final String text;
     final String quant;
     final DocumentReference documentReference;

     @override
     Widget build(BuildContext context) {
       return Padding(
         padding: const EdgeInsets.all(8.0),
         child: Expanded(
           flex: 1,
        child: Column(

          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Container(
              color: Colors.tealAccent,
              child: FlatButton(
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Text(
                        text,
                        style: TextStyle(color: Colors.black, fontSize: 20),
                      ),
                      Text(quant,
                          style: TextStyle(color: Colors.black, fontSize: 20))
                    ],
                  ),
                  onPressed: () {
                     documentReference.delete();
                  }),
            )
          ],
        ),
         ),
       );
     }
   }"""

  Flutter doctor:
  [✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
  [✓] Xcode - develop for iOS and macOS (Xcode 11.4)
  [✓] Chrome - develop for the web
  [✓] Android Studio (version 3.5)
  [✓] VS Code (version 1.44.0)
  [✓] Connected device (3 available)

  • No issues found!

You need to add return keyword when using the build function since it returns a Widget :您需要在使用build function 时添加return关键字,因为它返回一个Widget

 class MessagesStream extends StatelessWidget {
     @override
     Widget build(BuildContext context) {
       return FutureBuilder(
         future: _fetchdata,
         builder: (context, myFuture){
           if (myFuture.connectionState == ConnectionState.done && !myFuture.hasError &&               myFuture.hasData) {
      if (myFuture.data != null) {

        return StreamBuilder<QuerySnapshot>(

For people having the same issue - here is my full code!对于有同样问题的人 - 这是我的完整代码! Hope it helps希望能帮助到你

import 'package:flutter/material.dart';
import 'package:list/screens/add_new_item_screen.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

final _firestore = Firestore.instance;
FirebaseUser loggedinUser;

Future<void> _fetchdata;

FirebaseAuth _auth = FirebaseAuth.instance;

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  void initState() {
    super.initState();

    _fetchdata = getCurrentUser();
  }

  Future<void> getCurrentUser() async {
    try {
      final user = await _auth.currentUser();
      if (user != null) {
        loggedinUser = user;
        // print(loggedinUser.email);
      }
    } catch (e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
              context, MaterialPageRoute(builder: (context) => Addnewitem()));
        },
        child: Icon(Icons.add),
      ),
      appBar: AppBar(
        leading: Container(),
        title: Text("Shopping List"),
        actions: <Widget>[
          IconButton(
              icon: Icon(Icons.close),
              onPressed: () {
                // messagesStream();
                _auth.signOut();
                Navigator.pop(context);
              })
        ],
      ),
      body: SafeArea(
        child: MessagesStream(),
      ),
    );
  }
}

class MessagesStream extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: _fetchdata,
        builder: (context, myFuture) {
          if (myFuture.connectionState == ConnectionState.done &&
              !myFuture.hasError) {
            return StreamBuilder<QuerySnapshot>(
                stream: _firestore
                    .collection('users')
                    .document(loggedinUser.uid)
                    .collection('items')
                    .snapshots(),
                builder: (context, snapshot) {
                  if (!snapshot.hasData ||
                      snapshot.hasError ||
                      snapshot.data == null ||
                      snapshot.connectionState == ConnectionState.waiting ||
                      loggedinUser.email == null) {
                    return (Center(
                        child: CircularProgressIndicator(
                            backgroundColor: Colors.lightBlueAccent)));
                  }
                  final items = snapshot.data.documents.reversed;
                  List<MessageBubble> messageBubbles = [];
                  for (var message in items) {
                    final item = message.data['item'];

                    final quant = message.data['quant'];
                    final id = message.data['id'];
                    final boli = message.data['bool'];

                    // final currentUser = loggedinUser.email;

                    final messageBubble = MessageBubble(
                      text: item,
                      quant: quant,
                      documentReference: message.reference,
                    );

                    messageBubbles.add(messageBubble);
                  }
                  try {
                    return Expanded(
                      child: ListView(
                        // reverse: true,
                        padding:
                            EdgeInsets.symmetric(horizontal: 10, vertical: 10),
                        children: messageBubbles,
                      ),
                    );
                  } catch (e) {
                    return Container();
                  }
                });
          } else {
            return CircularProgressIndicator();
          }
        });
  }
}

class MessageBubble extends StatelessWidget {
  MessageBubble({this.text, this.quant, this.documentReference});

  final String text;
  final String quant;
  final DocumentReference documentReference;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Expanded(
        flex: 1,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Container(
              color: Colors.tealAccent,
              child: FlatButton(
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: <Widget>[
                      Text(
                        text,
                        style: TextStyle(color: Colors.black, fontSize: 20),
                      ),
                      Text(quant,
                          style: TextStyle(color: Colors.black, fontSize: 20))
                    ],
                  ),
                  onPressed: () {
                    documentReference.delete();
                  }),
            )
          ],
        ),
      ),
    );
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Flutter/Firebase_Auth:构建 function 返回 null - Flutter/Firebase_Auth: a build function returned null “构建 function 返回 null。有问题的小部件是:信息构建函数不得返回 null。返回一个空白空间” - "A build function returned null. The offending widget is: info Build functions must never return null. To return an empty space" Flutter 错误“构建 function 返回 null” - Flutter error "A build function returned null" Flutter Future:构建函数返回null - Flutter Future:A build function returned null 在 null 上调用了 getter 'iterator'。 Flutter &amp; FireBase - The getter 'iterator' was called on null. Flutter & FireBase Flutter Web 应用程序,Firebase.auth 不工作。 试图调用一个非函数,例如null。 'dart.global.firebase.auth' - Flutter Web App, Firebase.auth not working. Tried to call a non-function, such as null. 'dart.global.firebase.auth' Flutter Firebase 数据库“在 null 上调用了方法 'forEach'。” - Flutter Firebase Database “The method 'forEach' was called on null.” 在 null 上调用了 getter 'uid'。 接收方:null 尝试调用:uid Flutter Firebase - The getter 'uid' was called on null. Receiver: null Tried calling: uid Flutter Firebase Flutter 方法在 null 上被调用。 接收器:空 - Flutter The method was called on null. Receiver: null Flutter、Dart、Firebase:方法 [] 在 Z37A6259CC0C1DAE299ZBD7866 上调用工作一次下一次错误 - Flutter, Dart, Firebase: The Method [] was called on null. Works one time the next an error
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM