【问题标题】:A build function returned null. Flutter Firebase构建函数返回 null。颤振火力基地
【发布时间】:2020-07-28 09:21:35
【问题描述】:

我尝试了很多方法,但找不到任何可行的解决方案,请帮助。 即使使用 FutureBuilder,它似乎也不起作用,没有它,我在热重载时会得到结果。我不知道如何更改代码以使其正常工作。可能缺少一些小东西,但我还不知道它是什么或如何解决它。

"""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!

【问题讨论】:

    标签: firebase flutter dart


    【解决方案1】:

    使用build函数时需要添加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>(
    

    【讨论】:

    • 大声笑没有看到 - 非常感谢,做了一些更改并删除了一些 if 语句,它现在可以工作了
    【解决方案2】:

    对于有同样问题的人 - 这是我的完整代码!希望对你有帮助

    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();
                      }),
                )
              ],
            ),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-05
      • 2021-03-10
      • 2021-07-03
      • 2021-02-03
      • 1970-01-01
      • 2021-11-20
      • 2020-11-04
      • 2021-03-19
      • 2020-06-26
      相关资源
      最近更新 更多