繁体   English   中英

如何使用 StreamProvider 返回子集合? [颤振,Firebase]

[英]How do I return a subcollection using StreamProvider? [Flutter, Firebase]

我遵循了 TheNetNin​​ja 的 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,

此外,由于uidDatabaseService的必需参数,您可以将其标记为@required以便分析器可以显示传递该参数的提示。 见下文:

class DatabaseService {
  final String uid;

  DatabaseService({@required this.uid}); //Added the @required annotation here

  ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM