Android Dart-需要点击提交按钮两次才能在firestore中保存数据

Android Dart-需要点击提交按钮两次才能在firestore中保存数据,android,firebase,dart,flutter,google-cloud-firestore,Android,Firebase,Dart,Flutter,Google Cloud Firestore,上下文:我正在构建一个表单来存储我的高级项目的一些简单用户信息。有3个字段和一个提交按钮。用户信息存储在用户文档中的firestore中 问题:当我点击submit时,正在更新的用户文档中的字段被设置为null。然后,为了更新用户文档中要更新的字段,需要再次点击submit按钮 userSettingsPage.dart void _submitForm() { final FormState form = _formKey.currentState; var userManager = ne

上下文:我正在构建一个表单来存储我的高级项目的一些简单用户信息。有3个字段和一个提交按钮。用户信息存储在用户文档中的firestore中

问题:当我点击submit时,正在更新的用户文档中的字段被设置为null。然后,为了更新用户文档中要更新的字段,需要再次点击submit按钮

userSettingsPage.dart

void _submitForm() {
final FormState form = _formKey.currentState;

var userManager = new UserManager();
userManager.updateUser(updatedUser, mCurrentUser.uid);

if (!form.validate()) {
  showMessage('Form is not valid!  Please review and correct.');
} else {
  form.save(); //This invokes each onSaved event
 }
}

bool isValidUserCode(String input) {
RegExp regex = new RegExp('');
switch(input){
  case '123456789': {
    newUserRole = "professor";
    regex = new RegExp('123456789');
  }
  break;
  case '987654321': {
    newUserRole = "security";
    regex = new RegExp('987654321');
  }
  break;
  case '666': {
    newUserRole = "student";
    regex = new RegExp('666');
  }
  break;
  case '': {
     regex = new RegExp('');

  }
}
return regex.hasMatch(input);

}


Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
  key: _scaffoldKey,
  appBar: new AppBar(
    title: new Text('Settings'),
  ),
  body: new Container(
    padding: new EdgeInsets.all(20.0),
    child: new Form(
        key: _formKey,
        autovalidate: true,
        child: new ListView(
          children: <Widget>[
            new TextFormField(
              decoration: new InputDecoration(
                hintText: 'Name',
                labelText: 'Your Name'
              ),
                validator: (value) {
                  if (value.isEmpty) {
                    return 'Please enter some text';
                  }
                },
                onSaved: (val) => updatedUser.name = val
            ),
            new TextFormField(
                decoration: new InputDecoration(
                    hintText: '1234567',
                    labelText: 'ID number'
                ),
              inputFormatters: [new LengthLimitingTextInputFormatter(7)],
                onSaved: (val) => updatedUser.ID = val
            ),
            new TextFormField(
                obscureText: true,
                decoration: new InputDecoration(
                    hintText: 'User Role Code',
                    labelText: 'Enter code (for faculty and staff only)',
                ),
                validator: (value) => isValidUserCode(value) ? null : 'Not a valid code',
                onSaved: (value) => updatedUser.role = newUserRole,
            ),
            new Text("Bugs suck, please hit submit button twice in order to send data.", textAlign: TextAlign.center,),
            new Container(
                padding: const EdgeInsets.only(left: 40.0, top: 20.0, right: 40.0),
                child: new RaisedButton(
                  child: const Text('Submit'),
                  onPressed: _submitForm,
                )
            ),
            new Text("Changes will take effect next time you close and reopen page.", textAlign: TextAlign.center,),
          ],
        )
    ),
  ),
);
void\u submitForm(){
final FormState form=\u formKey.currentState;
var userManager=new userManager();
updateUser(updateUser,mCurrentUser.uid);
如果(!form.validate()){
showMessage('表单无效!请检查并更正');
}否则{
form.save();//这将调用每个onsave事件
}
}
布尔isValidUserCode(字符串输入){
RegExp regex=新的RegExp(“”);
开关(输入){
案件“123456789”:{
newUserRole=“professor”;
regex=newregexp('123456789');
}
打破
案例“987654321”:{
newUserRole=“安全”;
regex=newregexp('987654321');
}
打破
案件‘666’:{
newUserRole=“学生”;
regex=新的RegExp('666');
}
打破
案例“”:{
regex=新的RegExp(“”);
}
}
返回regex.hasMatch(输入);
}
小部件构建(构建上下文){
//TODO:实现构建
归还新脚手架(
钥匙:_scaffoldKey,
appBar:新的appBar(
标题:新文本(“设置”),
),
主体:新容器(
填充:新边缘设置。全部(20.0),
儿童:新表格(
键:_formKey,
自动验证:true,
子:新列表视图(
儿童:[
新TextFormField(
装饰:新的输入装饰(
hintText:'名称',
标签文字:“你的名字”
),
验证器:(值){
if(value.isEmpty){
返回“请输入一些文本”;
}
},
onSaved:(val)=>UpdateUser.name=val
),
新TextFormField(
装饰:新的输入装饰(
hintText:'1234567',
labelText:“ID号”
),
inputFormatters:[新长度限制文本InputFormatter(7)],
onSaved:(val)=>UpdateUser.ID=val
),
新TextFormField(
蒙昧文字:对,
装饰:新的输入装饰(
hintText:'用户角色代码',
labelText:“输入代码(仅限教员和员工)”,
),
validator:(值)=>isValidUserCode(值)?null:“不是有效代码”,
onSaved:(值)=>UpdateUser.role=newUserRole,
),
新文本(“Bugs吮吸,请点击提交按钮两次以发送数据。”,textAlign:textAlign.center,),
新容器(
填充:仅限常量边集(左:40.0,上:20.0,右:40.0),
孩子:新升起的按钮(
子项:const Text('Submit'),
按下按钮:_submitForm,
)
),
新文本(“更改将在下次关闭并重新打开页面时生效。”,textAlign:textAlign.center,),
],
)
),
),
);
userManager.dart

final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final Firestore _firestoreDB = Firestore.instance;


Future<void> updateUser(User user, String uid) async {
  Map<String, dynamic> userData = Map();
  userData["name"] = user.name;
  userData["ID"] = user.ID;
  userData["role"] = user.role;
  Firestore.instance.collection("users").document(uid).setData(userData, merge: true);
}
final FirebaseAuth\u FirebaseAuth=FirebaseAuth.instance;
最终Firestore _firestoreDB=Firestore.instance;
Future updateUser(用户,字符串uid)异步{
Map userData=Map();
userData[“name”]=user.name;
userData[“ID”]=user.ID;
userData[“角色”]=user.role;
Firestore.instance.collection(“users”).document(uid).setData(userData,merge:true);
}

无法找出问题所在。

使用控制器从TextFormField获取文本,如下所示,当调用_submitForm()时,它将从TextFormField获取文本并将其分配给UpdateUser属性:

void\u submitForm(){
final FormState form=\u formKey.currentState;
设置状态(){
updateuser.name=controllerName.text;
updateuser.ID=controllerID.text;
updateuser.role=controllerRole.text;
});
var userManager=new userManager();
updateUser(updateUser,mCurrentUser.uid);
如果(!form.validate()){
showMessage('表单无效!请检查并更正');
}否则{
form.save();//这将调用每个onsave事件
}
}
最终文本编辑控制器名称=文本编辑控制器();
最终TextEditingController控制器ID=TextEditingController();
final TextEditingController controllerRole=TextEditingController();
小部件构建(构建上下文){
//TODO:实现构建
归还新脚手架(
钥匙:_scaffoldKey,
appBar:新的appBar(
标题:新文本(“设置”),
),
主体:新容器(
填充:新边缘设置。全部(20.0),
儿童:新表格(
键:_formKey,
自动验证:true,
子:新列表视图(
儿童:[
新TextFormField(
控制器:控制器名称,
装饰:新的输入装饰(
hintText:'名称',
标签文字:“你的名字”
),
验证器:(值){
if(value.isEmpty){
返回“请输入一些文本”;
}
},
onSaved:(val)=>UpdateUser.name=val
),
新TextFormField(
控制器:controllerID,
装饰:新的输入装饰(
hintText:'1234567',
labelText:“ID号”
),
inputFormatters:[新长度限制文本InputFormatter(7)],
onSaved:(val)=>UpdateUser.ID=val
),
新TextFormField(
控制器:Controllerole,
蒙昧文字:对,
装饰:新的InputDecora
void _submitForm() {
final FormState form = _formKey.currentState;

setState(() {
    updatedUser.name = controllerName.text;
    updatedUser.ID = controllerID.text;
    updatedUser.role = controllerRole.text;
});

var userManager = new UserManager();
userManager.updateUser(updatedUser, mCurrentUser.uid);

if (!form.validate()) {
  showMessage('Form is not valid!  Please review and correct.');
} else {
  form.save(); //This invokes each onSaved event
 }
}

final TextEditingController controllerName = TextEditingController();
final TextEditingController controllerID = TextEditingController();
final TextEditingController controllerRole = TextEditingController();


Widget build(BuildContext context) {
// TODO: implement build
return new Scaffold(
  key: _scaffoldKey,
  appBar: new AppBar(
    title: new Text('Settings'),
  ),
  body: new Container(
    padding: new EdgeInsets.all(20.0),
    child: new Form(
        key: _formKey,
        autovalidate: true,
        child: new ListView(
          children: <Widget>[
            new TextFormField(
                controller: controllerName,
              decoration: new InputDecoration(
                hintText: 'Name',
                labelText: 'Your Name'
              ),
                validator: (value) {
                  if (value.isEmpty) {
                    return 'Please enter some text';
                  }
                },
                onSaved: (val) => updatedUser.name = val
            ),
            new TextFormField(
                controller: controllerID,
                decoration: new InputDecoration(
                    hintText: '1234567',
                    labelText: 'ID number'
                ),
              inputFormatters: [new LengthLimitingTextInputFormatter(7)],
                onSaved: (val) => updatedUser.ID = val
            ),
            new TextFormField(
                controller: controllerRole,
                obscureText: true,
                decoration: new InputDecoration(
                    hintText: 'User Role Code',
                    labelText: 'Enter code (for faculty and staff only)',
                ),
                validator: (value) => isValidUserCode(value) ? null : 'Not a valid code',
                onSaved: (value) => updatedUser.role = newUserRole,
            ),
            new Text("Bugs suck, please hit submit button twice in order to send data.", textAlign: TextAlign.center,),
            new Container(
                padding: const EdgeInsets.only(left: 40.0, top: 20.0, right: 40.0),
                child: new RaisedButton(
                  child: const Text('Submit'),
                  onPressed: _submitForm,
                )
            ),
            new Text("Changes will take effect next time you close and reopen page.", textAlign: TextAlign.center,),
          ],
        )
    ),
  ),
);