【问题标题】:Provider exposes incorrect values with Streams提供者使用 Streams 公开不正确的值
【发布时间】:2020-01-28 04:10:20
【问题描述】:

我正在使用 Provider 向树深处的 Widget 公开一些参数。小部件是从 Streambuilder 构建的,即 Firebase 文档

但是,Provider 似乎没有公开正确的值

我的代码的一个非常简化的版本:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';

class Parameters {
  Parameters(this.documentId);
  final String documentId;
}

class Widget1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<QuerySnapshot>(
        stream: mystream, //Query the Firebase for a bunch of Documents
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return Text('Error processing data feed');
          }
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              {
                return CircularProgressIndicator();
              }
              break;
            default:
              {
                var _messages = snapshot.data.documents;

                return ListView.builder(
                    itemCount: _messages.length,
                    itemBuilder: (context, index) {
                      return Provider<Parameters>(
                          builder: (context) =>
                              Parameters(_messages[index].documentID),
                          child: AnotherWidget());
                    });
              }
          }
        });
  }
}

class AnotherWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Parameters param = Provider.of<Parameters>(context);
    return Text(param.documentId);
  }
}

第一次构建小部件时,这非常有效。但是,当插入新文档时,AnotherWidget 会显示上一个文档的文档 ID

更新流时如何获取正确的文档 ID?

注意:我知道我可以简单地将文档作为参数传递。但是我需要AnotherWidget的小部件树深处的参数

【问题讨论】:

    标签: flutter google-cloud-firestore provider


    【解决方案1】:

    看起来这正是引入 ProxyProvider 的原因

    https://pub.dev/documentation/provider/latest/provider/ProxyProvider-class.html 引用重要说明:

    相对于Provider的builder参数,builder可以被多次调用。它会在挂载小部件时调用一次,然后在 ProxyProvider 所依赖的任何 InheritedWidget 发出更新时调用一次

    通过使用包含ProxyProvider的MultiProvider包装AnotherWidget(如下)解决了这个问题

    child: MultiProvider(
                            providers: [
                                Provider.value(value: _messages[index].documentID),
                                ProxyProvider<String, Parameters>(
                                  builder: (context, documentId, parameters) => Parameters(documentId),
                                ),
                              ],
                              child: AnotherWidget()));
    

    【讨论】:

      猜你喜欢
      • 2021-06-09
      • 2021-01-06
      • 2019-12-05
      • 2019-12-23
      • 2021-02-19
      • 2023-03-28
      • 2020-06-04
      相关资源
      最近更新 更多