簡體   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