flutter - Flutter StreamProvider 返回 null 对象,即使流正在返回对象
问题描述
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
import 'package:collection/collection.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
var _db = FirestoreService();
return MultiProvider(
providers: [
StreamProvider(create:(context)=>_db.getItems(),
catchError:(BuildContext context,e){
print("Error:$e");
return null;
},
updateShouldNotify:const ListEquality<Item>().equals),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Catalog(),
),
);
}
}
class Item{
String name;
double price;
Item({this.name,this.price});
Item.fromJSON(Map<String,dynamic> json)
:name=json['name'],
price=json['price'];
factory Item.fromMap(Map data)
{
return Item(name: data['name'],price:data['price']);
}
}
class FirestoreService{
var _db = Firestore.instance;
Stream<List<Item>> getItems()
{
return _db.collection('akurdi')
.snapshots()
.map((snapshot)=>snapshot.documents
.map((document)=>Item.fromMap(document.data)).toList());
}
}
class Catalog extends StatelessWidget {
@override
Widget build(BuildContext context) {
var items = Provider.of<List<Item>>(context);
print(items.length);
return ListView.builder(
itemCount: items.length,
itemBuilder: (context,index){
return ListTile(
title: Text(items[index].name),
trailing: Text(items[index].price.toString())
);
},
);
}
}
错误:
I/flutter (12444):在 null 上调用了 getter 'length'。
I/颤振(12444):接收器:空
I/flutter (12444):尝试调用:长度
当我特别调试代码 getItems() 函数时,我看到了来自 firestore 数据库的实际值,但是当我使用提供程序时
var items = Provider.of>(context) 获取值,它返回 null。
解决方案
我认为updateShouldNotify是这里真正的问题。在该条件不成立之前,数据不会改变。
只需简单地删除该 updateShouldNotify 即可。
当您想控制何时必须更改数据时,您可以使用它。例如添加或删除任何新数据,然后您可以比较以前和当前的数据长度并相应地更新。
推荐阅读
- laravel - 如何从 laravel 中的 API 路由调用 Api 控制器?
- python - 如何不计算单词之间的标点符号
- azure - Get-AzureADApplicationPasswordCredential cmdlet 是否有效?
- go - 如何同时优化大型递归任务
- java - 着色问题(有 2 种颜色),其中每个顶点都有一个特定区域并使用 DFS 找到最小区域着色
- typescript - 检查设置存储库中的用户角色(打字稿,aurelia)
- angular - Angular - 使用 Angular 服务获取数据
- c# - .include() 影响查询的结果数
- php - $request->hasFile() 上传时返回 false
- oracle - 如何在 V$SQL 中获取程序执行 SQL 查询的 PID