提交后禁用表单清除文本表单字段



有没有办法在提交后禁用表单清除文本表单字段?我已经创建了简单的登录表单,其中包含两个登录到Firebase的TextFormField(电子邮件和密码(。我选择表单是因为验证器功能。除了使用错误的凭据提交表单外,一切都很好,然后所有 TextFormFields 都是空的,我必须重新输入它们,这在密码上没问题,但在电子邮件上很奇怪

这是代码

class LoginScreen extends StatelessWidget {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
String _email;
String _password;
final Status status = Provider.of<UserRepository>(context).status;
void submitForm() {
if (!_formKey.currentState.validate()) {
return;
}
_formKey.currentState.save();
try {
Provider.of<UserRepository>(context, listen: false)
.signIn(_email, _password, context);
} catch (e) {
print(e);
}
}
return Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Form(
key: _formKey,
child: ListView(
children: <Widget>[
SizedBox(
height: 30,
),
TextFormField(
initialValue: _email,
keyboardType: TextInputType.emailAddress,
autofocus: true,
decoration: kTextFieldDecoration.copyWith(hintText: 'Email'),
validator: emailValidator,
onSaved: (value) {
_email = value.trim();
},
),
SizedBox(
height: 15,
),
TextFormField(
obscureText: true,
decoration:
kTextFieldDecoration.copyWith(hintText: 'Password'),
onSaved: (value) {
_password = value.trim();
}),
SizedBox(
height: 10,
),
RoundedButton(
title: 'Login',
color: Colors.lightBlueAccent,
onPressed: () {
submitForm();
},
),
],
),
),

我尝试使用变量初始化电子邮件字段_email但提交后即使变量为空。我在文档中到处寻找,但没有找到任何解决方案。 提前致谢

我尝试了您的代码,但它没有清除我这边的字段。 无论如何,最佳做法是:

  • 将 LoginScreen 转换为 StatefulWidget
  • 将变量和函数移生成方法
  • 使用 TextEditorController 而不是 String 进行_email和_password

这可能会有所帮助。请记住,每次呈现小部件都会调用构建方法。

PS :在有状态小部件中,更改setState((){})中的状态,以便小部件重建。

使用StatefulWidget

因为StatelessWidget调用构建方法的原因有很多,例如(屏幕旋转、动画、滚动(。

您可以使用shared_preferences来保存电子邮件。

感谢您的所有回答,但是我设法做到了,而无需将我的登录屏幕转换为 StateFull 小部件。基本上正如我提到的,我使用提供程序在屏幕上导航(经过身份验证,未经身份验证(,所以我将电子邮件的初始值保存在那里,然后在重建无状态屏幕时引发异常后选择它们

这是我的提供程序代码的安心

class UserRepository with ChangeNotifier {
FirebaseAuth _auth;
FirebaseUser _user;
Status _status = Status.Uninitialized;
Map<String, String> _initialValue = {'email': ''};
.
.
Status get status => _status;
FirebaseUser get user => _user;
String get initialEmail => _initialValue['email'];
.
.
Future<bool> signIn(
String email, String password, BuildContext context) async {
try {
_status = Status.Authenticating;
notifyListeners();
_initialValue['email'] = email;
await _auth.signInWithEmailAndPassword(email: email, password: password);
return true;
} on PlatformException catch (e) {
_status = Status.Unauthenticated;
exceptionAlertDialog(context, e.message);
notifyListeners();
return false;
}
}

这是我登录屏幕中的文本字段

TextFormField(
initialValue: Provider.of<UserRepository>(context).initialEmail,
autocorrect: false,
keyboardType: TextInputType.emailAddress,
autofocus: true,
decoration: kTextFieldDecoration.copyWith(hintText: 'Email'),
validator: emailValidator,
onSaved: (value) {
_email = value.trim();
},
),

我不确定这是否是正确的方法,但它有效。我正在尝试尽可能低地使用状态完整小部件,仅出于此目的将我的登录屏幕转换为有状态小部件听起来有点奇怪

最新更新