提问人:Trịnh Văn Khánh 提问时间:10/21/2023 最后编辑:Trịnh Văn Khánh 更新时间:10/21/2023 访问量:32
在 Flutter 中使用 StreamProvider 监听 Stream
Listen Stream with StreamProvider in Flutter
问:
我正在编码功能添加到应用程序中的购物卡购买书籍示例。
- 我有一个 API /count 来获取用户添加到购物卡的产品总数
- API /list 是 shoppingcard 中的产品列表,此列表运行正常
- 根据 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
答: 暂无答案
评论