簡體   English   中英

如何使用 StateNotifierProvider 中的 StreamProvider?

[英]How do I use a StreamProvider from a StateNotifierProvider?

我嘗試使用 StateNotifierProvider 中的 StreamProvider。

這是我的 StreamProvider,到目前為止工作正常。

final productListStreamProvider = StreamProvider.autoDispose<List<ProductModel>>((ref) {
  CollectionReference ref = FirebaseFirestore.instance.collection('products');
  return ref.snapshots().map((snapshot) {
    final list = snapshot.docs
        .map((document) => ProductModel.fromSnapshot(document))
        .toList();
    return list;
  });
});

現在我正在嘗試填充我的購物車,以便從頭開始將所有產品放入其中。

final cartRiverpodProvider = StateNotifierProvider((ref) => 
new CartRiverpod(ref.watch(productListStreamProvider));

這是我的 CartRiverPod StateNotifier

class CartRiverpod extends StateNotifier<List<CartItemModel>> {

  CartRiverpod([List<CartItemModel> products]) : super(products ?? []);

  void add(ProductModel product) {
    state = [...state, new CartItemModel(product:product)];
    print ("added");
  }

  void remove(String id) {
    state = state.where((product) => product.id != id).toList();
  }
}

完成此操作的最簡單方法是接受Reader作為 StateNotifier 的參數。

例如:

class CartRiverpod extends StateNotifier<List<CartItemModel>> {
  CartRiverpod(this._read, [List<CartItemModel> products]) : super(products ?? []) {
    // use _read anywhere in your StateNotifier to access any providers.
    // e.g. _read(productListStreamProvider);
  }

  final Reader _read;

  void add(ProductModel product) {
    state = [...state, new CartItemModel(product: product)];
    print("added");
  }

  void remove(String id) {
    state = state.where((product) => product.id != id).toList();
  }
}

final cartRiverpodProvider = StateNotifierProvider<CartRiverpod>((ref) => CartRiverpod(ref.read, []));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM