Flutter StreamProvider returns 空对象,尽管流正在返回对象

Flutter StreamProvider returns null object eventhough stream is returning objects

    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):getter 'length' 被调用为 null。

I/flutter (12444):接收方:空

I/flutter (12444):尝试调用:长度

当我专门调试 getItems() 函数的代码时, 我从 firestore 数据库中看到了实际值,但是当我使用 provider

var 项目 = Provider.of>(上下文) 要获取值,它 returns null。

我认为 updateShouldNotify 才是真正的问题所在。在该条件不成立之前,数据不会更改。

只需删除 updateShouldNotify 即可。

当您想要控制何时必须更改数据时,您可以使用它。例如添加或删除任何新数据,然后您可以比较以前和当前的数据长度并相应地更新。