我已经学习2-3个月了,我感到在理解状态管理方面已经达到了一个基本的障碍。不幸的是,这篇文章会很长,所以请和我一起裸露,希望我能提出正确的细节。
问题定义 我在购物车中有一个小部件列表,在我单击减号的那一点上,它只剩下1个,必须将其删除。无论我怎么尝试,都无法删除该小部件。如果我单击“后退”按钮并返回购物车,则该商品将不再显示。
我考虑了其他方法,例如处理小部件(似乎不起作用),并且我正忙于实现可视性Show/hide widgets in Flutter programmatically 但这不是正确的方法。如果我对提供者,changeNotifiers,异步和将来的构建者的理解正确,则以下方法应该有效,并且我认为它是我通行的基础,以了解为什么它不起作用工作。
概述:这个想法是使用CartItemWidget上的减号按钮来调用更新存储在本地设备上的Json的方法,然后在ProductProvider中重新填充List cartProdList,该调用 notifyListeners(),然后应将其传播到使用该提供程序的所有地方。现在,我已经成功地使用了5次此模式,这次唯一的不同是它将删除一个我以前没有做过的小部件。但是,如果将来基于相同的提供程序,这应该可以动态地起作用吗?
函数调用顺序
CartItemWidget.onPressed:()
通话>>>
ProductProvider.cartMinusOne(String id)
通话>>>
ProductProvider.Future<List<Product>> cartProducts()
代码在这里。我也不介意对我在所有方面都可以做得更好的事情发表评论。
CartWidget
class CartWidget extends StatefulWidget {
@override
_CartWidgetState createState() => _CartWidgetState();
}
class _CartWidgetState extends State<CartWidget> {
var providerOfProd;
ProductProvider cartProdProvider = new ProductProvider();
@override
void initState() {
_productsList = new ProductsList();
super.initState();
providerOfProd = Provider.of<ProductProvider>(context, listen: false).cartProducts();
}
@override
Widget build(BuildContext context) {
........
Column(children: <Widget>[
FutureBuilder(
future: providerOfProd,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Container(
width: 0,
height: 0,
);
case ConnectionState.done:
return ListView.separated(
..............
},
itemBuilder: (context, index) {
return CartItemWidget(
product: cartProdProvider.cartProdList.elementAt(index),
heroTag: 'cart',
quantity: cartProdProvider.cartProdList.elementAt(index).cartqty,
key: UniqueKey(),
);
},
);
.........
CartItemWidget
class CartItemWidget extends StatefulWidget {
CartItemWidget({Key key, this.product, this.heroTag, this.quantity = 1}) : super(key: key);
// ProductProvider cartProd = new ProductProvider();
String heroTag;
Product product;
int quantity;
@override
_CartItemWidgetState createState() => _CartItemWidgetState();
}
class _CartItemWidgetState extends State<CartItemWidget> {
@override
Widget build(BuildContext context) {
return Consumer<ProductProvider>(
builder: (context, productProv, _) => InkWell(
child: Container(
.............
child: Row(
children: <Widget>[
.............
IconButton(
onPressed: () {
setState(() {
productProv.cartMinusOne(widget.product.id);
widget.quantity = this.decrementQuantity(widget.quantity);
});
}
.............
ProductProvider
class ProductProvider with ChangeNotifier {
ProductProvider() {
cartProducts();
}
List<Product> cartProdList;
cartMinusOne(String id) async {
//Code to minus item,then return as a string to save as local jason
var test = jsonEncode(cartList);
saveLocalJson(test, 'cart.json');
cartProducts();
notifyListeners();
}
Future<List<Product>> cartProducts() async {
String jsonString = await JsonProvider().getProductJson();
String cartString = await getCartJson();
var filterProdList = (json.decode(jsonString) as List).map((i) => Product.fromJson(i)).toList();
//code to get match cart list to product list
cartProdList = filterProdList.where((element) => element.cartqty > 0).toList();
notifyListeners();
return cartProdList;
}
........................