【问题标题】:Flutter Firebase Database "The method 'forEach' was called on null."Flutter Firebase 数据库“在 null 上调用了方法‘forEach’。”
【发布时间】:2020-08-31 04:21:17
【问题描述】:

我有一个名为 Database.dart 的文件,我在其中插入了“虚拟”数据并设置了与 Firebase 的连接。有了 Meals.dart,我想稍后在屏幕上显示数据。现在我想在我的调试控制台中显示这个虚拟数据。我试图更改 Meals.dart 中的“mealList”,但我没有弄清楚我的代码中的问题是什么。

这是我得到的错误代码。

════════ Exception caught by widgets library ═══════════════════════════════════
The following NoSuchMethodError was thrown building Meals(dirty, dependencies: [_InheritedProviderScope<List<MealsAndWhen>>], state: _MealsState#ed4e6):
The method 'forEach' was called on null.
Receiver: null
Tried calling: forEach(Closure: (MealsAndWhen) => Null)

The relevant error-causing widget was
    Meals 
lib/…/MealPlan/mealplan.dart:23
When the exception was thrown, this was the stack
#0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:53:5)
#1      _MealsState.build 
package:mealapp/…/Widgets/meals.dart:17
#2      StatefulElement.build 
package:flutter/…/widgets/framework.dart:4619
#3      ComponentElement.performRebuild 
package:flutter/…/widgets/framework.dart:4502
#4      StatefulElement.performRebuild 
package:flutter/…/widgets/framework.dart:4675
...
════════════════════════════════════════════════════════════════════════════════
flutter:
flutter:

我的 Database.dart 代码是

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:mealapp/models/Widgets/whenAndWhatToEat.dart';

class DatabaseService {

  final String uid;
  DatabaseService({ this.uid });

  // collection reference
  final CollectionReference mealCollection = Firestore.instance.collection('mealList');


  Future updateUserData(String shopping, String name, String whatEat, String whenEat) async {

    return await mealCollection.document(uid).setData({
      'shopping': shopping,
      'name': name,
      'whatEat': whatEat,
      'whenEat': whenEat,
    });    
  }

  //Meal List from Snapshot
  List<MealsAndWhen> _mealAndWhenListFromSnapshot(QuerySnapshot snapshot){
    return snapshot.documents.map((doc){
      return MealsAndWhen(
        whenEat: doc.data['When'] ?? '',
        whatEat: doc.data['What'] ?? '',
      );
    }).toList();
  }


  //get shoppingList Stream
  Stream<List<MealsAndWhen>> get mealList {
    return mealCollection.snapshots()
    .map(_mealAndWhenListFromSnapshot);
  }

}

我的 Meals.dart 代码是

import 'package:flutter/material.dart';
import 'package:mealapp/models/Widgets/whenAndWhatToEat.dart';
import 'package:provider/provider.dart';


class Meals extends StatefulWidget {
  @override
  _MealsState createState() => _MealsState();
}

class _MealsState extends State<Meals> {
  @override
  Widget build(BuildContext context) {


    final meals = Provider.of<List<MealsAndWhen>>(context);
    meals.forEach((meals){
      print(meals.whatEat);
      print(meals.whenEat);
    });


    return Container(

    );
  }
}

【问题讨论】:

    标签: database firebase flutter dart google-cloud-firestore


    【解决方案1】:

    将你的 forEach 包装在一个空检查中。 因为 firebase 的回复需要一些时间。

    在 null 上调用了方法“forEach”。

    if (meals != null) {
        meals.forEach((meals){
          print(meals.whatEat);
          print(meals.whenEat);
        });
    }
    

    在您的返回区域执行以下操作:

    return (meals == null || meals.isEmpty) ? Text('empty') : ListView.builder(
            itemCount: meals.length,
            itemBuilder: (context, index) {
              print(meals[index].whatEat);
              print(meals[index].whenEat);
              return text('Something');
            },
          );
    

    【讨论】:

    • 谢谢!你的回答帮了我!问候
    • @Tempelritter 如果 Jotcode 的回答对您有帮助,您可以接受 :)
    【解决方案2】:

    您错误地调用了属性。 您定义属性'whatEat': whatEat'whenEat': whenEat

    然后,您使用不同的名称调用属性,['When']['What']

    解决方案: 尝试将['When'] 更改为['whenEat']['What'] 更改为['whatEat']

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2021-10-19
      • 2021-02-16
      • 2020-11-06
      • 2019-09-23
      • 2020-06-04
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多