如何使用 Flutter CircularProgressIndicator() 中间的 Form?

How to use Flutter CircularProgressIndicator() middle of the Form?

我有一个表格; - 3个文本表单域 - 1个下拉菜单。 - 1 个普通文本 ************** - 2 个文本表单字段

并基于下拉列表(Yes/No)示例;如果该部分为是,则从互联网获取价值并分配给普通文本并继续显示最后 2 个文本表单字段。

我的问题是,当我从 Internet 中间的表单获取数据时,如何使用 CircularProgressIndicator()。我知道如何使用 CircularProgressIndicator() 和显示小部件,但我可以让它在表单中间做同样的事情。如何使用表单中间的 CircularProgressIndicator() 并继续……

完整代码在这里。为了清楚起见,我使用 Future.delayed 来演示我是如何做到的。我们可以使用 Future ....() async {} 从互联网获取数据,因此很容易将 void _showPrint() 替换为 Future _getDataFromInternet() async {...... _load = false; _buildRest = true;}

class _MyHomePageState extends State<MyHomePage> {
  bool _load = false;
  bool _buildRest = false;

  void _showPrint() {
    print("loading is true");
    Future.delayed(const Duration(seconds: 6), () {
      setState(() {
        _load = false;
        _buildRest = true;
      });
    });
  }

  //TODO: MAIN BUILD WIDGET *****************************
  @override
  Widget build(BuildContext context) {
    Widget loadingIndicator = _load
        ? new Container(
            color: Colors.green.withOpacity(0.3),
            width: MediaQuery.of(context).size.width,//70.0,
            height: MediaQuery.of(context).size.height, //70.0,
            child: new Padding(
                padding: const EdgeInsets.all(5.0),
                child: new Center(child: new CircularProgressIndicator())),
          )
        : new Container();
    return new Scaffold(
        backgroundColor: Colors.white,
        body: new Stack(
          children: <Widget>[
            new Padding(
              padding:
                  const EdgeInsets.symmetric(vertical: 50.0, horizontal: 20.0),
              child: new ListView(
                children: <Widget>[
                  new Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      new TextField(),
                      new TextField(),
                      new TextField(),
                      new TextField(),
                      new Padding(
                          padding: EdgeInsets.only(top:20.0),
                        child: new FlatButton(
                            color: Colors.green[400],
                            child: new Text('Get Data From Internet'),
                            onPressed: () {
                              setState(() {
                                _load = true;
                              });
                              _showPrint();
                            }),
                      ),
                      _buildRest == true
                        ? _buildRestoftheForm()
                        : new Container()
                    ],),],),
            ),
            new Align(
              child: loadingIndicator,
              alignment: FractionalOffset.center,
            ),
          ],
        ));
  }

  Widget _buildRestoftheForm(){
    return new Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
        new TextField(),
        new TextField(),
        new TextField(),
      ],
    );
  }
}

我不完全理解您是否希望用户在检索数据时能够触摸表单。如果没有,那么我建议使用 modal progress hud package。您将以更少的努力实现 Nick 提供的相同目标。