Функция сборки вернула ноль. Флаттер Firebase - PullRequest
0 голосов
/ 15 апреля 2020

Я много чего перепробовал, но не смог найти работоспособного решения, пожалуйста, помогите. Даже с 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!

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вам необходимо добавить ключевое слово return при использовании функции build, поскольку оно возвращает 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>(
0 голосов
/ 15 апреля 2020

Для людей, имеющих такую ​​же проблему - вот мой полный код! Надеюсь, это поможет

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();
                  }),
            )
          ],
        ),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...