在 Flutter 中使用 StreamProvider 监听 Stream

Listen Stream with StreamProvider in Flutter

提问人:Trịnh Văn Khánh 提问时间:10/21/2023 最后编辑:Trịnh Văn Khánh 更新时间:10/21/2023 访问量:32

问:

我正在编码功能添加到应用程序中的购物卡购买书籍示例。

  1. 我有一个 API /count 来获取用户添加到购物卡的产品总数
  2. API /list 是 shoppingcard 中的产品列表,此列表运行正常
  3. 根据 BLoC 架构,我有一个 shoppingcardStream 和 shoppingcardSink 当用户点击“购买”时,我添加事件“addToCard”流,shoppingcardStream 将监听该事件,并将新事件下沉到 UI 页面,使用 StreamProvider,我得到 value.total(产品数量)并显示给用户。 我的问题:当点击“购买”时,总回报 -1,而不是 +1,我检查这是我的默认值,如果得到 API 返回 null(图 1) 如果我重建应用程序,总计是正确的值,我不知道为什么会出现这个错误以及如何修复它,请帮帮我,我已经延迟了 5 天:(( 非常感谢。图1 图2

这是显示“总计”的类

class CartWidget extends StatefulWidget {
  @override
  _CartWidgetState createState() => _CartWidgetState();
}

class _CartWidgetState extends State<CartWidget> {
  @override
  void initState() {
    super.initState();
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();

    var bloc = Provider.of<HomeBloc>(context);
    bloc.getShoppingCartInfo();
  }

  @override
  Widget build(BuildContext context) {
    return Consumer<HomeBloc>(
      builder: (context, bloc, child) {
        return StreamProvider<ShoppingCart?>.value(
          initialData: null,
          value: bloc.shoppingCartStream,
          catchError: (context, error) {
            return ShoppingCart(total: -1);
          },
          child: Consumer<ShoppingCart?>(
            builder: (context, value, child) {
              if (value == null) {
                return Container(
                  margin: EdgeInsets.only(top: 15, right: 20),
                  child: Icon(Icons.shopping_cart),
                );
              }
              return GestureDetector(
                onTap: () {
                  Navigator.pushNamed(context, "/checkout");
                },
                child: Container(
                  margin: EdgeInsets.only(top: 15, right: 20),
                  child: badges.Badge(
                    badgeContent: Text(
                      "${value.total}",
                      style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                    child: Icon(Icons.shopping_cart),
                  ),
                ),
              );
            },
          ),
        );
      },
    );
  }
}

这是我的BLoC

  final _shoppingCardSubject = BehaviorSubject<ShoppingCart>();
  Stream<ShoppingCart> get shoppingCartStream => _shoppingCardSubject.stream;
  Sink<ShoppingCart> get shoppingCartSink => _shoppingCardSubject.sink;

  @override
  void dispatchEvent(BaseEvent event) {
    switch (event.runtimeType) {
      case AddToCartEvent:
        handleAddToCart(event);
        break;
    }
  }

  handleAddToCart(event) {
    AddToCartEvent addToCartEvent = event as AddToCartEvent;
    _orderRepo.addToCart(addToCartEvent.bookData).then((shoppingCart) {
      shoppingCartSink.add(shoppingCart);
    });
  }

  getShoppingCartInfo() {
    Stream<ShoppingCart>.fromFuture(_orderRepo.getShoppingCartInfo()).listen(
        (shoppingCart) {
      _shoppingCart = shoppingCart;
      shoppingCartSink.add(shoppingCart);
    }, onError: (err) {
      _shoppingCardSubject.addError(err);
    });
  }

这是从后端获取“总计”的类,当我单击“购买”时返回 -1

class ShoppingCart {
  int total;

  ShoppingCart({required this.total});

  factory ShoppingCart.fromJson(Map<String, dynamic> json) => ShoppingCart(
        total: json["data"] ?? -1,
      );
}

我试图找出为什么返回 null,但我不明白,当我单击“购买”时,我估计总数将增加 1

Flutter Dart 提供程序

评论


答: 暂无答案