数据未更新到另一个窗口小部件

时间:2020-08-23 15:43:35

标签: flutter

我试图显示购物车中商品的价格,但总值应显示在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;

1 个答案:

答案 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中。