我确信这是一个新手失误,但是我似乎弄不明白这一点. 在下面的应用程序中,当点击第二条路由中的文本字段时,键盘会打开,然后立即关闭.仔细研究后发现,每当窗口小部件获得焦点时,它似乎都在重新构建,导致路由重置,使得用户无法输入文本.

当我从表单中删除"键"时,问题不会发生.这不是一个长期的修复,因为我需要"密钥",这样我才能验证表单.

有什么 idea 吗?

import 'package:flutter/material.dart';


void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'My app',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
        fontFamily: 'Nunito',
      ),
      home: LoginPage(),
    );
  }
}


class LoginPage extends StatefulWidget {

  @override
  LoginPageState createState() {
    return new LoginPageState();
  }
}

class LoginPageState extends State<LoginPage> {

  Widget build(BuildContext context) {

    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

    final registerButton = Padding(
      padding: EdgeInsets.symmetric(vertical: 16.0),
      child: RaisedButton(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(24),
        ),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => SecondPage()),
          );
        },
        child: Text('Register Now', style: TextStyle(color: Colors.white)),
      ),
    );

    // Now load the main login page
    return Scaffold(
      backgroundColor: Colors.white,
      key: _scaffoldKey,
      body: Center(
        child: ListView(
          shrinkWrap: true,
          children: <Widget>[
            registerButton,
          ],
        ),
      ),
    );
  }
}


class SecondPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    final emailController =  TextEditingController();
    final _formKey = GlobalKey<FormState>();

    final email = TextFormField(
      keyboardType: TextInputType.emailAddress,
      controller: emailController,
      autofocus: false,
      decoration: InputDecoration(
        hintText: 'Email',
        contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
        border: OutlineInputBorder(borderRadius: BorderRadius.circular(32.0)),
      ),
    );

    return Scaffold(
      appBar: AppBar(
        title: Text('Second page'),
      ),
      body: Center(
        child: Form(
          key: _formKey,
          child: email,
        ),
      ),
    );
  }
}

推荐答案

必须在构建方法之外将_formKey声明为静态.

Dart相关问答推荐

Dart 中的const关键字放置有什么不同?

带有字符串键的 Dart Map,与忽略大小写进行比较

如何保存 List 并使用 Hive 检索?

需要一个SkDeletable类型的值,但得到一个Null类型的值

如何在 Flutter 的小部件树中将新的 MaterialPageRoute 作为子项打开

如何在 Dart 中使用类型Aliases/Typedefs(也是非函数)?

如何从Flatter应用程序中导航到网页?(OAuth)

如何仅从 DateTime.now() 中提取时间;

如何在dart中获得一周的开始或结束

Dart 是否支持参数化单元测试?

如何在 Dart 中使用 char 类型?

Dart 中的抽象基类

如何在 Dart 2 中将 List 更改为 List

有 Javascript 到 Dart 的转换器吗?

带范围的dartswitch

Dart如何将逗号添加到字符串编号

如何在 Dart 中从外部查询 shadow DOM 中的元素?

如何在 Dart 中扩展列表?

`FutureOr` 的目的是什么?

dart捕捉clause子句