我试图显示购物车中商品的价格,但总值应显示在TextField中。我正在将数据保存到SQLite并检索,然后显示给窗口小部件,但是当我尝试访问 total_price
到另一个窗口小部件时,它没有更新,但是当我再次按热重载时,数据显示但不是第一次我正在打开页面
return FutureBuilder<List<CartModel>>(
future: fetchCartFromDatabase(),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data.length > 0) {
cartCount = snapshot.data.length;
for(int i = 0;i<snapshot.data.length;i++){
var price = snapshot.data[i].product_price.split("₹");
total_price+=double.parse(price[1]);
}
} else if (snapshot.hasData && snapshot.data.length == 0) {
return new Text("No Data found");
}
else
{
return new Container(
alignment: AlignmentDirectional.center,
child: new CircularProgressIndicator(),
);
}
);
值已初始化
int cartCount = 0;
double total_price=0.0;
答案 0 :(得分:3)
FutureBuilder
仅更新其子级。要更新另一个小部件的值,必须使用setState。
最好的方法是将FutureBuilder置于较高级别或使用某种状态管理器,例如提供程序。
要使用setState,您需要初始化您从stetefullWidget的initState获取(或从函数中调用)。这样,您将不需要FutureBuilder,而必须重构代码:
class YourWidget extends StatefulWidget {
@override
_YourWidgetState createState() => _YourWidgetState();
}
class _YourWidgetState extends State<YourWidget> {
double total_price = 0;
@override
void initState() {
super.initState();
fetchCartFromDatabase().then((value){
setState((){
for(int i = 0;i<value.length;i++){
var price = value[i].product_price.split("₹");
total_price+=double.parse(price[1]);
}
});
});
}
}
addPostFrameCallback不是一个好的解决方案,因为它仅在下一帧更新值。当应用增长时,会导致滞后。
要继续使用FutureBuilder,请将需要更新的窗口小部件树移动到FutureBuilder中。