Flutter StreamProvider返回空对象,即使流正在返回对象

时间:2020-05-02 15:42:41

标签: flutter google-cloud-firestore flutter-provider

    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。

1 个答案:

答案 0 :(得分:1)

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

只需删除该updateShouldNotify即可使用。

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