解决FutureBuilder的问题

时间:2020-05-11 02:47:06

标签: flutter dart datatable

在我的Flutter项目中,我试图通过使用FutureBuilder来实现按钮单击事件。基本上,当单击按钮时,它应该获取数据并显示在表格中。所以我的按钮onPressed事件处理如下:

onPressed: () async{

                  if (_formKey.currentState.validate()) {

                    _formKey.currentState.save();

                    var p = double.parse(loanAmount);
                    var r = double.parse(interestRate);
                    var n = int.parse(monthes);

                    Api api = new Api();

                    new FutureBuilder<List>(
                      future: api.calculateEmi(p, r, n),
                      builder: (BuildContext buildContext, AsyncSnapshot<List> snapshot) {

                        if (!snapshot.hasData) {
                            return Center(child: CircularProgressIndicator());
                        } else {

                          print( snapshot.data);

                          return new SingleChildScrollView(
                            padding: const EdgeInsets.all(8.0),
                            child: DataTableWidget(listOfColumns: snapshot.data.map(
                              (e)=>{
                                'Month': e['Month'],
                                'Principal': e['Principal'],
                                'InterestP': e['InterestP'],
                                'PrinciplaP': e['PrinciplaP'],
                                'RemainP': e['RemainP']

                              }).toList()
                              ),
                          ); 
                        }

                      }
                      );


                  }
                }

Api调用正在工作,并且调用了calculateEmi方法并返回了数据(地图列表),但是视图只是未更新,并且根本没有表格出现,我在构建器部分使用了断点,但是它从未成功我在哪里做错了,有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

FutureBuilder需要插入到flutter小部件树中的某个位置。仅仅创建一个新的FutureBuilder并不能告诉flutter如何处理它。

我猜想您是想将您创建的FutureBuilder放在onPressed方法的父窗口小部件中。如果只需要在按下按钮时才显示它,可以使用bool来决定是否显示FutureBuilder

例如。

Widget build(context) {
  if(buttonPressed) {
    return FutureBuilder(
      ...
    );
  }
  else {
    return Container();
  }
}