【发布时间】:2021-07-29 19:28:33
【问题描述】:
我仍在学习 Flutter/Dart 并在此过程中创建应用程序。
现在,我正在查看我的代码,并认为我没有使用我在 main.dart 文件中创建的一些 StreamProviders 太辛苦了。我在旅程的一开始就这样做了,所以我真的不知道自己在做什么。我只是在学习一个教程。
因此,我在 main.dart 中创建了一个 multiprovider 和一些 StreamProviders。
Widget build(BuildContext context) {
final firestoreService = FirestoreService();
Provider.debugCheckInvalidValueType = null;
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => AgentProvider()),
ChangeNotifierProvider(create: (context) => AgencyProvider()),
ChangeNotifierProvider(create: (context) => TrxnProvider()),
ChangeNotifierProvider(create: (context) => EventProvider()),
// The following providers are for retrieving the data for editing purposes
// The stream providers are only called once but they can be accessed
// anywhere in the app.
StreamProvider(create: (context) => firestoreService.getAgents(), initialData: []),
StreamProvider(create: (context) => firestoreService.getAgency(), initialData: []),
StreamProvider(
create: (context) => firestoreService.getAgencyTrxns(context), initialData: []),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
home: LoginScreen(),
),
);
}
如您所见,我添加了注释说明我可以在代码中的任何位置访问流,但我一直在创建新的流。是的,这很尴尬,但我正在学习。
这是用于创建上述 StreamProviders 的 3 个函数
Stream<List<Agents>> getAgents() {
return _db.collection('agents').snapshots().map((snapshot) => snapshot.docs
.map((document) => Agents.fromFirestore(document.data()))
.toList());
}
Stream<List<Agency>> getAgency() {
return _db.collection('agency').snapshots().map((snapshot) => snapshot.docs
.map((document) => Agency.fromFirestore(document.data()))
.toList());
}
Stream<QuerySnapshot> getAgencyTrxns(BuildContext context) async* {
yield* FirebaseFirestore.instance
.collection('agency').doc(globals.agencyId)
.collection('trxns')
.where('trxnStatus', isNotEqualTo: 'Closed')
.snapshots();
}
如果我意识到我所做的事情会为我节省很多工作......我想。
现在,我正在尝试学习如何在我的代码中使用这些 StreamProvider。如何在 StreamBuilder 中使用它们?目前,这就是我正在做的事情,我认为我没有使用我在 main.dart 中创建的 StreamProviders。
child: StreamBuilder(
stream: _db.collection('agency').snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data == null) {
return Center(
child: CircularProgressIndicator(),
);
} else {
我想我需要使用消费。我正在观看 YouTube 视频,但不是很清楚。我真的很想使用我已经拥有的 StreamProviders,而不是创建新的流和使用内存。
您可以提供的任何帮助,或者您是否可以向我指出一个更好的教程。
【问题讨论】: