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):在空值上调用了吸气剂“长度”。
I / flutter(12444):接收方:空
I / flutter(12444):尝试调用:长度
当我特别调试代码getItems()函数时, 我从firestore数据库中看到了实际值,但是当我使用提供程序时
var个项目= Provider.of>(上下文) 要获取值,它将返回null。
答案 0 :(得分:1)
我认为 updateShouldNotify 是这里的真正问题。在该条件不成立之前,数据将不会更改。
只需删除该updateShouldNotify即可使用。
当您要控制何时必须更改数据时,可以使用它。例如添加或删除的任何新数据,然后您就可以比较以前和当前的数据长度并进行相应的更新。