[英]How do I return a subcollection using StreamProvider? [Flutter, Firebase]
我遵循了 TheNetNinja 的 Flutter 和 Firebase 教程,但现在我正在尝试显示子集合中的信息。
class Menu extends StatefulWidget {
@override
_MenuState createState() => _MenuState();
}
class _MenuState extends State<Menu> {
@override
Widget build(BuildContext context) {
return StreamProvider<List<Food>>.value(
initialData: [],
value: DatabaseService().food,
child: Scaffold(
body: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
width: double.infinity,
color: Colors.grey,
child: FoodList(),
),
),
);
}
^菜单.dart
class FoodList extends StatefulWidget {
@override
_FoodListState createState() => _FoodListState();
}
class _FoodListState extends State<FoodList> {
@override
Widget build(BuildContext context) {
final food = Provider.of<List<Food>>(context);
return ListView.builder(
itemCount: food.length,
itemBuilder: (context, index) {
return FoodTile(food: food[index]);
},
);
}
}
^food_list.dart
class FoodTile extends StatelessWidget {
final Food food;
FoodTile({this.food});
@override
Widget build(BuildContext context) {
return foodInfoCard(context, Icons.person_outline, 'Name', food.name);
}
Card foodInfoCard(
BuildContext context, IconData icon, String title, String subtitle) {
return Card(
margin: EdgeInsets.fromLTRB(20, 6, 20, 0),
child: ListTile(
leading: Icon(icon),
title: Text(title),
subtitle: Text(subtitle),
),
);
}
}
^food_tile.dart
class DatabaseService {
final String uid;
DatabaseService({this.uid});
final CollectionReference restaurantCollection =
FirebaseFirestore.instance.collection('restaurant');
List<Food> _foodListFromSS(QuerySnapshot snapshot) {
return snapshot.docs.map((doc) {
return Food(
name: doc.data()['name'] ?? '',
description: doc.data()['description'] ?? '',
oriPrice: doc.data()['oriPrice'] ?? 0.0,
salePrice: doc.data()['salePrice'] ?? 0.0,
pax: doc.data()['pax'] ?? 0,
);
}).toList();
}
Stream<List<Food>> get food {
return restaurantCollection
.doc(uid)
.collection('food')
.snapshots()
.map(_foodListFromSS);
}
}
^数据库.dart
我一直在寻找解决方案,但其中大多数是 streambuilder 而不是 streamproviders。 我已经使用streamproviders完成了大部分工作,所以idrk如何更改它。 谁能帮我? :'(
您需要向Menu
小部件中的DatabaseService
构造函数提供uid
。
这:
value: DatabaseService().food,
应该改为:
value: DatabaseService(uid).food,
此外,由于uid
是DatabaseService
的必需参数,您可以将其标记为@required
以便分析器可以显示传递该参数的提示。 见下文:
class DatabaseService {
final String uid;
DatabaseService({@required this.uid}); //Added the @required annotation here
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.