firebase - 仅在我第一次运行时出错'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);
}
解决方案
我不确定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 值。
推荐阅读
- dart - 如何在列表飞镖中使用字符串?
- jquery - 国家气象局 GET 请求 400 错误
- c# - 托管在 ASP.NET Core 项目上的 Blazor Webassembly 项目中的身份验证问题
- prometheus - Prometheus Query 以高间隔和周期丢失数据
- excel - 返回字符串中的特殊字符
- javascript - 使用 useState、Material-UI 和自定义钩子对搜索结果进行分页时遇到问题
- ruby - aws ruby sdk - 从 S3 读取一个相当大的文件
- pandas - 'FloatingArray' 对象没有属性 'round'
- apache-kafka - 从不同的独占订阅消费时,Pulsar 分区主题是否支持全局排序?
- java - Java Api for TopMetricsAggregation of Elastic search