首页 > 解决方案 > Flutter StreamProvider 返回 null 对象,即使流正在返回对象

问题描述

    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):在 null 上调用了 getter 'length'。

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

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

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

var items = Provider.of>(context) 获取值,它返回 null。

标签: fluttergoogle-cloud-firestoreflutter-provider

解决方案


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

只需简单地删除该 updateShouldNotify 即可。

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


推荐阅读