Flutter Flatter StreamProvider在流返回对象时返回空对象 导入“包装:颤振/材料.省道”; 导入“包:cloud_firestore/cloud_firestore.dart”; 导入“包:provider/provider.dart”; 导入“package:collection/collection.dart”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ //此小部件是应用程序的根。 @凌驾 小部件构建(构建上下文){ var_db=FirestoreService(); 回程多供应商( 供应商:[ StreamProvider(创建:(上下文)=>\u db.getItems(), catchError:(构建上下文,e){ 打印(“错误:$e”); 返回null; }, updateShouldNotify:const listQuality().equals), ], 孩子:MaterialApp( 标题:“颤振演示”, 主题:主题数据( 主样本:颜色。蓝色, ), 主页:目录(), ), ); } } 类项目{ 字符串名; 双倍价格; 项目({this.name,this.price}); Item.fromJSON(映射json) :name=json['name'], price=json['price']; factory Item.fromMap(地图数据) { 退货项目(名称:数据['name',价格:数据['price']); } } 类别消防服务{ var_db=Firestore.instance; 流getItems() { 返回_db.collection('akurdi')) .快照() .map((快照)=>snapshot.documents .map((document)=>Item.fromMap(document.data)).toList(); } } 类目录扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ var items=提供者(上下文); 打印(项目长度); 返回ListView.builder( itemCount:items.length, itemBuilder:(上下文,索引){ 返回列表块( 标题:文本(项目[索引].名称), 尾随:文本(项目[索引].price.toString()) ); }, ); } }
错误: I/flatter(12444):getter“length”被调用为null I/颤振(12444):接收器:空 I/颤振(12444):尝试呼叫:长度 当我调试代码,特别是getItems()函数时, 我看到firestore数据库中的实际值,但当我使用提供程序时 var items=Provider.of>(上下文)Flutter Flatter StreamProvider在流返回对象时返回空对象 导入“包装:颤振/材料.省道”; 导入“包:cloud_firestore/cloud_firestore.dart”; 导入“包:provider/provider.dart”; 导入“package:collection/collection.dart”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ //此小部件是应用程序的根。 @凌驾 小部件构建(构建上下文){ var_db=FirestoreService(); 回程多供应商( 供应商:[ StreamProvider(创建:(上下文)=>\u db.getItems(), catchError:(构建上下文,e){ 打印(“错误:$e”); 返回null; }, updateShouldNotify:const listQuality().equals), ], 孩子:MaterialApp( 标题:“颤振演示”, 主题:主题数据( 主样本:颜色。蓝色, ), 主页:目录(), ), ); } } 类项目{ 字符串名; 双倍价格; 项目({this.name,this.price}); Item.fromJSON(映射json) :name=json['name'], price=json['price']; factory Item.fromMap(地图数据) { 退货项目(名称:数据['name',价格:数据['price']); } } 类别消防服务{ var_db=Firestore.instance; 流getItems() { 返回_db.collection('akurdi')) .快照() .map((快照)=>snapshot.documents .map((document)=>Item.fromMap(document.data)).toList(); } } 类目录扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ var items=提供者(上下文); 打印(项目长度); 返回ListView.builder( itemCount:items.length, itemBuilder:(上下文,索引){ 返回列表块( 标题:文本(项目[索引].名称), 尾随:文本(项目[索引].price.toString()) ); }, ); } },flutter,google-cloud-firestore,flutter-provider,Flutter,Google Cloud Firestore,Flutter Provider,错误: I/flatter(12444):getter“length”被调用为null I/颤振(12444):接收器:空 I/颤振(12444):尝试呼叫:长度 当我调试代码,特别是getItems()函数时, 我看到firestore数据库中的实际值,但当我使用提供程序时 var items=Provider.of>(上下文) 要获取值,它将返回null。我认为updateShouldNotify才是真正的问题所在。除非该条件不成立,否则数据不会更改 只需删除updateShouldNoti
要获取值,它将返回null。我认为updateShouldNotify才是真正的问题所在。除非该条件不成立,否则数据不会更改 只需删除updateShouldNotify即可
当您想要控制何时必须更改数据时,可以使用它。例如,添加或删除任何新数据后,您可以比较以前的数据长度和当前的数据长度,并相应地进行更新。删除以下行后是否可以尝试。updateShouldNotify:const ListQuality()。是否等于?获取错误后是否显示数据?因为最初流中没有数据,因为出现了错误。是的,最初我没有使用Updateshouldnotify,但它仍然没有在收到错误后显示工作数据?因为最初流中没有数据,因为错误出现。没有数据显示,它只是返回调用列表生成器时的错误。将长度0(null)用于提供初始数据是必要的,因为在我的情况下,无论何时首次构建应用程序,它调用流提供者并请求列表流,列表流将进一步调用对firestore数据库的调用,因此我认为它将使用从流接收的数据进行初始化
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())
);
},
);
}
}