forms - 如何从另一个屏幕重置 Flutter 中的表单?

如何重置(清除)flutter 应用中的表单字段?一旦数据提交到服务器?

在我的应用中,我有 2 个页面。

输入表单详细信息的第一页,例如姓名、地址等

第二页是上传图片。

第一页将数据推送到第二页。 (这里我不做推送替换,意味着第二页位于第一页的顶部)

第二页是选择图片,将表单数据和图片上传到服务器。

我的问题是

上传完成后如何重置所有 2 个页面?

我正在使用 firebase 服务器上传我的数据!

谢谢,提前

最佳答案

例如,使用 GlobalKey<FormState>访问表单状态和reset()田野。 考虑到这一点,您可以:

  1. 在第二屏的构造函数中传入第一个表单域 键并同时重置两者(当您的数据完成时 处理到服务器左右)

class Screen1 extends StatefulWidget {
  _Screen1State createState() => _Screen1State();
}

class _Screen1State extends State<Screen1> {
  final _formKeyScreen1 = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First screen'),
      ),
      body: Center(
        child: Form(
          key: _formKeyScreen1,
          child: Column(
            children: <Widget>[
              TextFormField(),
              TextFormField(),
              TextFormField(),
              RaisedButton(
                child: Text('Navigate to second screen...'),
                onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                      builder: (BuildContext context) => Screen2(_formKeyScreen1),
                    )),
              )
            ],
          ),
        ),
      ),
    );
  }
}

class Screen2 extends StatefulWidget {
  final GlobalKey<FormState> firstScreenFormKey;
  Screen2(this.firstScreenFormKey);
  _Screen2State createState() => _Screen2State();
}

class _Screen2State extends State<Screen2> {
  final _formKeyScreen2 = GlobalKey<FormState>();

  void _processData() {
    // Process your data and upload to server
    _formKeyScreen2.currentState?.reset();
    widget.firstScreenFormKey?.currentState?.reset();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second screen'),
      ),
      body: Center(
        child: Form(
          key: _formKeyScreen2,
          child: Column(
            children: <Widget>[
              TextFormField(),
              TextFormField(),
              TextFormField(),
              RaisedButton(
                child: Text('Submit data'),
                onPressed: () => _processData(),
              )
            ],
          ),
        ),
      ),
    );
  }
}
  1. 或者,当第二个屏幕从堆栈中弹出时,您可以重置第一个屏幕表单,IMO 应该足够了,因为我相信您不会在处理后从第二个屏幕访问第一个屏幕表单数据,因此,如果它是仅出于演示目的,返回时重置就足够了。在这种情况下,您将以以下方式结束

class Screen1 extends StatefulWidget {
  _Screen1State createState() => _Screen1State();
}

class _Screen1State extends State<Screen1> {
  final _formKeyScreen1 = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First screen'),
      ),
      body: Center(
        child: Form(
          key: _formKeyScreen1,
          child: Column(
            children: <Widget>[
              TextFormField(),
              TextFormField(),
              TextFormField(),
              RaisedButton(
                child: Text('Navigate to second screen...'),
                onPressed: () {
                  Navigator.of(context)
                      .push(MaterialPageRoute(
                        builder: (BuildContext context) => Screen2(),
                      ))
                      .then((_) => _formKeyScreen1.currentState.reset());
                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

class Screen2 extends StatefulWidget {
  _Screen2State createState() => _Screen2State();
}

class _Screen2State extends State<Screen2> {
  final _formKeyScreen2 = GlobalKey<FormState>();

  void _processData() {
    // Process your data and upload to server
    _formKeyScreen2.currentState?.reset();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second screen'),
      ),
      body: Center(
        child: Form(
          key: _formKeyScreen2,
          child: Column(
            children: <Widget>[
              TextFormField(),
              TextFormField(),
              TextFormField(),
              RaisedButton(
                child: Text('Submit data'),
                onPressed: () => _processData(),
              )
            ],
          ),
        ),
      ),
    );
  }
}

https://stackoverflow.com/questions/53986996/

相关文章:

ios - Flutter 在我的 Flutter 应用程序的根目录上构建 IOS 不起作用

dart - 检查无状态小部件是否在 flutter 中处理

ios - 将 watch 应用程序添加到 Flutter iOS 应用程序

flutter - Flutter 中的可滚动底部工作表

flutter - 标题在flexibleSpaceBar上没有正确显示

android-studio - Android : Could not find aapt2-pr

flutter - 检测用户是否离开 Flutter 中的当前页面?

dart - Flutter getter 没有为类指定,当它被指定时

dart - Flutter - 遍历对象键和值

dart - 在 Flutter 中获取设备的宽度和高度