我正在使用提供程序包,并有一个提供程序,该提供程序从全局变量的想法中获取其初始值,该想法包含json数据列表且类型为List
以下是该代码,可以正常工作。
final ideasListProvider = StateNotifierProvider<IdeaList>((ref) {
return IdeaList([for (var i in ideas) Idea.fromJson(i)]);
});
现在,我要实现的目标是替换可变主意,而使用从firebase上的集合中获得的文档列表。
但是我不确定如何从这里开始。
这是第二个从Firestore获取快照形式的提供程序。
final firbaseIdeaProvider = StreamProvider.autoDispose((ref) {
return FirebaseFirestore.instance.collection('ideas').snapshots();
});
我现在该怎么办? 我其余的代码依赖于ideaListProvider,因此我将不得不以某种方式向其提供firebase上idea集合中的文档列表。
答案 0 :(得分:1)
好消息,您的方向正确。首先,您要做的可能是将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()),
);
},
);
},
),
);
}
}