我正在使用提供程序包,并且有一个提供程序,它从全局变量idea获得其初始值,该全局变量idea是json数据的列表,类型为List>。
以下是代码,这是预期的工作。
final ideasListProvider = StateNotifierProvider<IdeaList>((ref) {
return IdeaList([for (var i in ideas) Idea.fromJson(i)]);
});
现在,我想要实现的是替换变量idea,而不是使用我从firebase上的集合中获得的文档列表。
但我不确定从现在开始该如何进行。
下面是第二个提供程序,它从firestore中获取快照。
final firbaseIdeaProvider = StreamProvider.autoDispose((ref) {
return FirebaseFirestore.instance.collection('ideas').snapshots();
});
我现在该干啥?我的其余代码依赖于ideasListProvider,所以我必须以某种方式向它提供firebase上的ideas集合中的文档列表。
发布于 2020-10-22 16:03:03
好消息是,你走上了正确的道路。首先,您想要做的可能是将firestore数据映射到数据模型。这可以通过创建从firestore数据流映射的新流来实现:
final firebaseIdeaProvider = StreamProvider.autoDispose<List<Idea>>((ref) {
final stream = FirebaseFirestore.instance.collection('ideas').snapshots();
return stream.map((snapshot) => snapshot.docs.map((doc) => Idea.fromJson(doc.data())).toList());
});
现在剩下的就是读取你的StreamProvider了。处理加载、错误和新数据状态的示例可能如下所示(使用hooks_riverpod):
class IdeasExample extends HookWidget {
const IdeasExample({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Ideas Example'),
),
body: useProvider(firebaseIdeaProvider).when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, stack) => Center(child: Text(err.toString())),
data: (ideas) {
return ListView.builder(
itemCount: ideas.length,
itemBuilder: (_, index) {
return ListTile(
title: Text(ideas[index].toString()),
);
},
);
},
),
);
}
}
不使用钩子:
class IdeasExample extends ConsumerWidget {
const IdeasExample({Key key}) : super(key: key);
@override
Widget build(BuildContext context, ScopedReader watch) {
return Scaffold(
appBar: AppBar(
title: Text('Ideas Example'),
),
body: watch(firebaseIdeaProvider).when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, stack) => Center(child: Text(err.toString())),
data: (ideas) {
return ListView.builder(
itemCount: ideas.length,
itemBuilder: (_, index) {
return ListTile(
title: Text(ideas[index].toString()),
);
},
);
},
),
);
}
}
https://stackoverflow.com/questions/64480671
复制相似问题