Flutter StreamProvider возвращает нулевой объект, хотя поток возвращает объекты - PullRequest
0 голосов
/ 02 мая 2020
    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 / флаттер (12444): получатель 'длина' вызван на ноль.

I / флаттер (12444): Приемник: ноль

I / flutter (12444): пробный вызов: длина

Когда я отлаживаю код специально функцией getItems (), я вижу фактические значения из базы данных firestore, но когда я использую провайдера

var items = Provider.of> (context) для получения значений возвращает ноль.

1 Ответ

1 голос
/ 02 мая 2020

Я думаю, updateShouldNotify - настоящая проблема здесь. до тех пор, пока это условие не станет истинным, данные не изменятся.

Просто удалите это updateShouldNotify, и оно будет работать.

Вы можете использовать его, когда хотите контролировать, когда должны быть изменены данные , например, любые новые данные добавляются или удаляются, затем вы можете сравнить предыдущую и текущую длину данных и соответственно обновить.

...