和我在标题中描述的差不多。 当应用程序启动时,我有一堆从Firebase填充的TextFormFields。
用户应该能够更新这些,当他们完成后,点击提交按钮来更新数据库。 数据库代码都能正常工作,但是有一些bug,工作原理如下。
TextFormField1: "New Text Entered"
TextFormField2: "Some more text"
TextFormField3: "Another update here"
现在我们需要取消键盘,这样我们就可以看到下面的提交按钮。 只要你点击向下的小箭头解散键盘,上面所有的变化就会恢复到原来的状态。
有谁见过这种情况?
我是在运行时预先填充这些字段中的数据,你可以编辑和更新文本,这一切都很好......除了如果你最小化键盘。
请告诉我Flutter没有做一些根本上愚蠢的事情,比如每次你要求键盘消失时,都要从头开始重新加载下面的小部件......。 有点感觉是这样的。
是的,我经常遇到这种情况。这是因为当底部插入(由于键盘)改变时,屏幕会重建。
TextFormField(s)
里面 Form
并给它一个全局键。为方便起见,我将附上一段代码。
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'),
),
],
),
),
),
);
}
}