颤振与振动;Firebase:FutureBileder出错

颤振与振动;Firebase:FutureBileder出错,firebase,flutter,google-cloud-firestore,Firebase,Flutter,Google Cloud Firestore,目前我开发了一个餐饮和购物应用程序。在这个应用程序中,你可以添加下一步想吃的东西,并拥有“secound”选项卡“购物”,在那里你可以添加下一步想买的东西。创建的是一个用户可以邀请另一个用户一起编辑列表 我得到如下所示的错误。我想不出如何归还集装箱。在void saveInviteToFirestore中,用户未被使用我是否需要使用它 代码 import 'package:flutter/material.dart'; import 'package:mealapp/models/Widgets

目前我开发了一个餐饮和购物应用程序。在这个应用程序中,你可以添加下一步想吃的东西,并拥有“secound”选项卡“购物”,在那里你可以添加下一步想买的东西。创建的是一个用户可以邀请另一个用户一起编辑列表

我得到如下所示的错误。我想不出如何归还集装箱。在void saveInviteToFirestore中,用户未被使用我是否需要使用它

代码

import 'package:flutter/material.dart';
import 'package:mealapp/models/Widgets/whenAndWhatToEat.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:intl/intl.dart';
import 'package:mealapp/models/global.dart';
import 'package:status_alert/status_alert.dart';
import 'package:firebase_auth/firebase_auth.dart';

class MealTile extends StatefulWidget {
  final MealsAndWhen mealsAndWhen;
  MealTile({this.mealsAndWhen});

  @override
  MealTileState createState() {
    return MealTileState();
  }
}

class MealTileState extends State<MealTile> {
  String id;
  final db = Firestore.instance;
  String mail;
  List<String> authors = [];

  DateTime selectedDate = DateTime.now();

  Future pickDate() async {
    DateTime datepick = await showDatePicker(
        context: context,
        initialDate: new DateTime.now(),
        firstDate: new DateTime.now().add(Duration(days: -0)),
        lastDate: new DateTime.now().add(Duration(days: 365)));
    if (datepick != null)
      setState(() {
        selectedDate = datepick;
      });
  }

  Future<String> inputData() async {
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    return user != null ? user.uid : null;
  }

  Future<String> inputDataMail() async {
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    return user != null ? user.email : null;
  }

  String userId;

  void _getUserId() {
    inputData().then((value) => setState(() {
          userId = value;
        }));
  }

  String currentMail;

  void _getMail(doc) {
    inputDataMail().then((value) => setState(() {
          currentMail = value;
        }));
  }

  /*void _getAuthors(DocumentSnapshot doc) async {
    authors = [];
    //if (await FirebaseAuth.instance.currentUser() != null) {
      authors = List.from(doc.data['Authors']);
      print(doc.data['authors']);
      //authors.insert(0, currentMail);
    //}
  }*/

  Widget buildItem(DocumentSnapshot doc) {
    DateTime now = doc.data['Date'].toDate();
    DateFormat formatter = DateFormat('dd-MM-yyyy');
    String formatted = formatter.format(now);
    _getUserId();
    _getMail(doc);
    if (doc.data['Authors'] != null) {
      //_getAuthors(doc);
      //print('Current mail: ' + currentMail + authors.toString() + doc.data['Author'] + doc.data['Meal']);
    }

    if (now.day == DateTime.now().day) { // If the Date of the meal is today
      deleteData(doc, false); // Delete it!
    }
    // You could also change ".day" to ".hour".
    // Example: if (now.day == DateTime.now().day && now.hour == DateTime.hour())
    // So, if a meal is set for 2PM, it will delete at 2PM

    return FutureBuilder<FirebaseUser>(
        future: FirebaseAuth.instance.currentUser(),
        builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
          if (snapshot.hasData && snapshot != null) {
            return Container(
              margin: const EdgeInsets.all(8.0),
              child: currentMail == doc.data['Author'] || // If the current mail is the author
                      List.from(doc.data['Authors']).contains(currentMail) // Or if the current mail is part of the authors
                  ? Column( // then if  true, show a Column
                      crossAxisAlignment: CrossAxisAlignment.center,
                      children: <Widget>[
                        Text(
                          'Meal:',
                          style: TextStyle(
                              fontSize: 24,
                              fontWeight: FontWeight.bold,
                              color: Colors.white),
                          textAlign: TextAlign.center,
                        ),
                        Text(
                          '${doc.data['Meal']}',
                          style: TextStyle(
                              fontSize: 24,
                              fontWeight: FontWeight.bold,
                              color: Colors.white),
                          textAlign: TextAlign.center,
                        ),
                        SizedBox(height: 20),
                        Text(
                          'When:',
                          style: TextStyle(
                              fontSize: 20,
                              fontWeight: FontWeight.bold,
                              color: Colors.white),
                          textAlign: TextAlign.center,
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: <Widget>[
                            IconButton(
                              onPressed: () => updateData(doc),
                              color: lightBlueColor,
                              icon: Icon(Icons.calendar_today,
                                  color: Colors.white),
                              tooltip: 'Update Date',
                            ),
                            Text(
                              formatted,
                              style: TextStyle(
                                  fontSize: 20,
                                  fontWeight: FontWeight.bold,
                                  color: Colors.white),
                              textAlign: TextAlign.center,
                            ),
                          ],
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.end,
                          children: <Widget>[
                            SizedBox(width: 8),
                            FlatButton(
                              color: Colors.red,
                              onPressed: () => deleteData(doc, true),
                              shape: RoundedRectangleBorder(
                                  borderRadius:
                                      BorderRadiusDirectional.circular(12)),
                              child: Row(children: <Widget>[
                                Text('Delete',
                                    style: TextStyle(
                                        fontWeight: FontWeight.bold,
                                        color: Colors.white)),
                                Icon(Icons.delete_forever, color: Colors.white),
                              ]),
                            ),
                            SizedBox(width: 8),
                            FlatButton(
                              color: Colors.blue,
                              onPressed: () => [
                                showDialog(
                                    context: context,
                                    builder: (BuildContext context) {
                                      return Dialog(
                                        child: invite(doc),
                                        shape: RoundedRectangleBorder(
                                          borderRadius: BorderRadius.all(
                                              Radius.circular(12)),
                                        ),
                                      );
                                    })
                              ],
                              shape: RoundedRectangleBorder(
                                  borderRadius:
                                      BorderRadiusDirectional.circular(12)),
                              child: Row(children: <Widget>[
                                Text('Invite',
                                    style: TextStyle(
                                        fontWeight: FontWeight.bold,
                                        color: Colors.white)),
                                Icon(Icons.share, color: Colors.white),
                              ]),
                            ),
                          ],
                        ),
                      ],
                    )
                  : Text(''), // if false, show an empty text widget
              decoration: BoxDecoration(
                color: lightBlueColor,
                borderRadius: BorderRadius.all(Radius.circular(12)),
              ),
            );
          }
          /*Navigator.pop(context);
          return HomePage();*/
        });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: darkGreyColor,
      body: ListView(
        padding: EdgeInsets.only(top: 220),
        children: <Widget>[
          StreamBuilder<QuerySnapshot>(
            stream: db
                .collection('mealList')
                .orderBy('Date', descending: false) // Order by Date, not descending
                .snapshots(),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Column(
                    children: snapshot.data.documents
                        .map((doc) => buildItem(doc))
                        .toList());
              } else {
                return Container();
              }
            },
          ),
        ],
      ),
    );
  }

  /*share(BuildContext context, DocumentSnapshot doc) {
    final RenderBox box = context.findRenderObject();
    final dynamic date = timeago.format(doc['Date'].toDate());

    Share.share(
      "${doc['Meal']} - $date",
      subject: doc['Meal'],
      sharePositionOrigin: box.localToGlobal(Offset.zero) & box.size,
    );
  }*/

  Widget invite(DocumentSnapshot doc) {
    final _formKey = GlobalKey<FormState>();
    return Form(
      key: _formKey,
      child: Padding(
        padding: const EdgeInsets.all(24.0),
        child: Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
          Center(
              child: Text(
            "Invite someone by mail",
            style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
          )),
          SizedBox(
            height: 24,
          ),
          TextFormField(
            decoration: InputDecoration(
                border: OutlineInputBorder(
                    borderRadius: BorderRadius.all(Radius.circular(12))),
                labelText: 'Enter the email address'),
            validator: (value) {
              if (value.isEmpty) {
                return 'Please enter an email address';
              }
              return null;
            },
            onSaved: (value) => mail = value,
          ),
          FlatButton(
            onPressed: () async {
              if (_formKey.currentState.validate()) {
                _formKey.currentState.save();
                saveInviteToFirestore(doc, mail);
              }
            },
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(12))),
            child: Text("Save"),
            color: redColor,
            textColor: Colors.white,
          ),
        ]),
      ),
    );
  }

  Future<String> getCurrentUser() async {
    return await FirebaseAuth.instance.currentUser().then((value) => value.uid);
  }

  void saveInviteToFirestore(DocumentSnapshot doc, String email) async {
    final String user = await getCurrentUser();
    var list = List<String>();
    list.add(email);

    Firestore.instance
        .collection('mealList')
        .document(doc.documentID)
        .updateData({"Authors": FieldValue.arrayUnion(list)});
    //setState(() => id = doc.documentID);
    StatusAlert.show(
      context,
      duration: Duration(seconds: 2),
      title: 'Added',
      subtitle: 'You have Added your and the Date to your List',
      configuration: IconConfiguration(icon: Icons.done),
    );
    //Navigator.pop(context);
  }

  void deleteData(DocumentSnapshot doc, bool showMessage) async {
    await db.collection('mealList').document(doc.documentID).delete();
    setState(() => id = null);
    if (showMessage) {
      StatusAlert.show(
        context,
        duration: Duration(seconds: 2),
        title: 'Deleted',
        subtitle: 'You have Deleted your Meal',
        configuration: IconConfiguration(icon: Icons.delete),
      );
    }
  }

  void updateData(DocumentSnapshot doc) async {
    await pickDate();
    await db
        .collection('mealList')
        .document(doc.documentID)
        .updateData({'Date': selectedDate});
    StatusAlert.show(
      context,
      duration: Duration(seconds: 2),
      title: 'Updated',
      subtitle: 'You have updated your Meal Date',
      configuration: IconConfiguration(icon: Icons.done),
    );
  }
}


导入“包装:颤振/材料.省道”;
导入“包:mealapp/models/Widgets/when和whattoeat.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:intl/intl.dart”;
导入“包:mealapp/models/global.dart”;
导入“包:状态\警报/状态\警报.dart”;
导入“包:firebase_auth/firebase_auth.dart”;
类MealTile扩展了StatefulWidget{
最终测量和何时测量和何时测量;
进餐时间({this.mealsAndWhen});
@凌驾
用餐状态{
返回进餐时间();
}
}
类进餐状态扩展状态{
字符串id;
final db=Firestore.instance;
字符串邮件;
列出作者=[];
DateTime selectedDate=DateTime.now();
Future pickDate()异步{
DateTime datepick=等待显示DatePicker(
上下文:上下文,
initialDate:new DateTime.now(),
firstDate:new DateTime.now().add(持续时间(天数:-0)),
lastDate:new DateTime.now().add(持续时间:365天));
如果(日期选择!=null)
设置状态(){
selectedDate=日期选择;
});
}
Future inputData()异步{
final FirebaseUser user=等待FirebaseAuth.instance.currentUser();
返回用户!=null?user.uid:null;
}
未来的inputDataMail()异步{
final FirebaseUser user=等待FirebaseAuth.instance.currentUser();
返回用户!=null?user.email:null;
}
字符串用户标识;
void _getUserId(){
inputData()。然后((值)=>setState(){
userId=值;
}));
}
字符串currentMail;
void\u getMail(doc){
inputDataMail()。然后((值)=>setState(){
currentMail=value;
}));
}
/*void\u getAuthors(DocumentSnapshot doc)异步{
作者=[];
//if(等待FirebaseAuth.instance.currentUser()!=null){
authors=List.from(文档数据['authors']);
打印(文档数据['作者]);
//作者。插入(0,currentMail);
//}
}*/
小部件构建项(DocumentSnapshot文档){
DateTime now=doc.data['Date'].toDate();
DateFormat格式化程序=DateFormat('dd-MM-yyyy');
String formatted=formatter.format(现在);
_getUserId();
_获取邮件(doc);
if(文档数据['Authors']!=null){
//_作者(doc);
//打印('Current mail:'+currentMail+authors.toString()+doc.data['Author']+doc.data['mean']);
}
如果(now.day==DateTime.now().day){//如果用餐日期是今天
deleteData(doc,false);//删除它!
}
//您还可以将“.day”更改为“.hour”。
//示例:if(now.day==DateTime.now().day&&now.hour==DateTime.hour())
//因此,如果一顿饭被设置为下午2点,它将在下午2点删除
回归未来建设者(
future:FirebaseAuth.instance.currentUser(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData&&snapshot!=null){
返回容器(
边距:所有常数边集(8.0),
child:currentMail==doc.data['Author']| |//如果当前邮件是作者
List.from(doc.data['Authors'])包含(currentMail)//或者如果当前邮件是作者的一部分
?列(//如果为true,则显示一列
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
正文(
"膳食",,
样式:TextStyle(
尺寸:24,
fontWeight:fontWeight.bold,
颜色:颜色。白色),
textAlign:textAlign.center,
),
正文(
“${doc.data['mean']}”,
样式:TextStyle(
尺寸:24,
fontWeight:fontWeight.bold,
颜色:颜色。白色),
textAlign:textAlign.center,
),
尺寸箱(高度:20),
正文(
“何时:”,
样式:TextStyle(
尺寸:20,
fontWeight:fontWeight.bold,
颜色:颜色。白色),
textAlign:textAlign.center,
),
划船(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
图标按钮(
按下:()=>updateData(文档),
颜色:浅蓝色,
图标:图标(Icons.calendar_今天,
颜色:颜色。白色),
工具提示:“更新日期”,
),
正文(
格式化,
样式:TextStyle(
尺寸:20,
fontWeight:fontWeight.bold,
颜色:颜色。白色),
textAlign:textAlign.center,
),
],
),
划船(
mainAxisAlignment:mainAxisAlignment.end,
儿童:[
尺寸箱(宽度:8),
The following assertion was thrown building FutureBuilder<FirebaseUser>(dirty, state: _FutureBuilderState<FirebaseUser>#a4504):
A build function returned null.

The offending widget is: FutureBuilder<FirebaseUser>
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
    FutureBuilder<FirebaseUser> 
lib/…/MealPlan/mealTile.dart:92
When the exception was thrown, this was the stack
#0      debugWidgetBuilderValue.<anonymous closure> 
package:flutter/…/widgets/debug.dart:276

return FutureBuilder<FirebaseUser>(
        future: FirebaseAuth.instance.currentUser(),
        builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
          if (snapshot.hasData && snapshot != null) {
            return Container(
             ...
            );
          }
          //ADDED ELSE BLOCK
          else {
            return Container();
          }
        }
      );