撤销键盘时,翩翩起舞的TextFormFields会被清除。

问题描述 投票:0回答:1

和我在标题中描述的差不多。 当应用程序启动时,我有一堆从Firebase填充的TextFormFields。

用户应该能够更新这些,当他们完成后,点击提交按钮来更新数据库。 数据库代码都能正常工作,但是有一些bug,工作原理如下。

TextFormField1:   "New Text Entered"
TextFormField2:   "Some more text"
TextFormField3:   "Another update here"

现在我们需要取消键盘,这样我们就可以看到下面的提交按钮。 只要你点击向下的小箭头解散键盘,上面所有的变化就会恢复到原来的状态。

有谁见过这种情况?

我是在运行时预先填充这些字段中的数据,你可以编辑和更新文本,这一切都很好......除了如果你最小化键盘。

请告诉我Flutter没有做一些根本上愚蠢的事情,比如每次你要求键盘消失时,都要从头开始重新加载下面的小部件......。 有点感觉是这样的。

flutter android-softkeyboard form-fields
1个回答
1
投票

是的,我经常遇到这种情况。这是因为当底部插入(由于键盘)改变时,屏幕会重建。

  1. 封闭 TextFormField(s) 里面 Form 并给它一个全局键。
  2. 使用一个本地变量来存储TextFormField的值。在onChanged方法中更新它。

为方便起见,我将附上一段代码。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: LoginScreen(),
    );
  }
}

// Login Screen
class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
  static GlobalKey<FormState> _loginScreenFormKey = GlobalKey<FormState>();
}

class _LoginScreenState extends State<LoginScreen> {
  String username;
  String password;

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Form(
          key: LoginScreen._loginScreenFormKey,
          child: Column(
            children: [
              TextFormField(
                decoration: InputDecoration(
                  hintText: 'Enter username',
                ),
                onChanged: (value) {
                  setState(() {
                    username = value;
                  });
                },
              ),
              TextFormField(
                decoration: InputDecoration(
                  hintText: 'Enter username',
                ),
                onChanged: (value) {
                  setState(() {
                    password = value;
                  });
                },
                obscureText: true,
              ),
              RaisedButton(
                onPressed: () {
                  LoginScreen._loginScreenFormKey.currentState.save();
                },
                child: Text('submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.