首页 > 解决方案 > 仅在我第一次运行时出错'getter'length'被调用为null。收件人:空'

问题描述

所以我尝试在第一次运行时构建 Sliverlist 我将子计数硬编码为 20(例如)并且应用程序工作得很好但是如果我尝试在第一次运行时将 childCount 设置为我的 FireStore 集合的长度我得到错误

======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building:
The getter 'length' was called on null.
Receiver: null
Tried calling: length

但!如果我首先将 childCount 手动设置为 20,然后在 childCount 设置为 handlyCalls.length 的情况下对应用程序进行热重载,它的工作原理应该是这样,有什么建议吗?

class HandlyCallsList extends StatefulWidget {
@override
_HandlyCallsListState createState() => _HandlyCallsListState();
}

class _HandlyCallsListState extends State<HandlyCallsList> {
@override
Widget build(BuildContext context) {

  final handlyCalls = Provider.of<List<HandlyCall>>(context);
  int count = 20;

return SliverList(
  delegate: SliverChildBuilderDelegate(
        (BuildContext context, index) {
          print('!!!!!!!!!!!! 11111111111111111111 ${handlyCalls.length}');
      return HandlyCallTile(handlyCall: handlyCalls[index]);
    },
    childCount: handlyCalls.length,
  ),
);

更新

这是handyCall to list函数

List<HandlyCall> _handlyCallListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((document) {
  return HandlyCall(
    title: document.data()['title'] ?? '',
    type: document.data()['type'] ?? '',
    reward: document.data()['reward'] ?? null,
    money: document.data()['money'] ?? 0,
    name: document.data()['name'] ?? '',
    rating: document.data()['rating'] ?? 25,
    user: document.data()['user'] ?? null,
  );
}).toList() ;
}

//get userProfile stream
Stream<List<HandlyCall>> get handlyCalls {
return handlyCallsCollection.snapshots().
map(_handlyCallListFromSnapshot);
}

标签: firebaseflutterflutter-listview

解决方案


我不确定handlyCalls 是什么样的,但我认为对您来说最好的方法是在一个类中创建列表,该类将在提供程序中处理并包含handlyCalls 列表,而不是给提供程序handlyCalls 列表。

所以会是这样的:

    class handlyCallsList extends ChangeNotifier {
    
      List<handlyCalls> _list;
    
      List<handlyCalls> get list => _list;
    
      void changeList(List<handlyCalls> list){
        this._list = list;
        notifyListeners(); // Important to notify all the listeners and make the listeners refresh the view
      }
    }

现在您应该使用默认值初始化您的提供程序,这样您就可以始终拥有一个列表,这样它在第一次运行时就不会为空。

ChangeNotifierProvider<handlyCallsList>(
      create: (_) => handlyCallsList()..changeList([]), // you can add the default list here for when it loads the first time so you will not find it null
);

您还可以检查该值以查看它返回的列表是否为 null,或使用 handlyCalls?.length 检查可能的 null 值。


推荐阅读