提供程序使用流公开不正确的值



我正在使用 Provider with 将一些参数公开给树下的小部件。小部件是从流构建器构建的,即Firebase文档

但是,提供程序似乎没有公开正确的值

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

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);
}
}

当第一次构建小部件时,这工作得很好。但是,当插入新文档时,OtherWidget 会显示上一个文档的文档 ID

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

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

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

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

与提供程序的生成器参数相反,可以多次调用生成器。当小部件挂载时,它将被调用一次,然后在 ProxyProvider 依赖的任何 InheritedWidget 发出更新时调用一次

通过将 AnotherWidget 与包含 ProxyProvider 的 MultiProvider 包装在一起(如下所示(解决了这个问题

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

相关内容

  • 没有找到相关文章

最新更新