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 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

错误:

I/flatter(12444):getter“length”被调用为null

I/颤振(12444):接收器:空

I/颤振(12444):尝试呼叫:长度

当我调试代码,特别是getItems()函数时, 我看到firestore数据库中的实际值,但当我使用提供程序时

var items=Provider.of>(上下文)
要获取值,它将返回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())
              );
          },
        );
      }
    }