我有一个数据更新屏幕,用户可以在其中更新/编辑保存在数据库中的数据。 我有多个字段,用户可以编辑。 数据将使用数据库中保存的先前值进行预填充。 我的编辑屏幕如下
@override
Widget build(BuildContext context) {
return Scaffold(
drawer: newdrawer(),
appBar: newappbar(
title: 'Edit Task',
),
body: SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(),
child: Center(
child: Column(
// mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
TextFormField(
decoration: InputDecoration(
labelText: 'Title',
),
initialValue: widget.postid.data['Title'],
onChanged: (value){
this.Title=value;
},
),
SizedBox(height: 5.0),
Container(
height: maxLines * 24.0,
child: TextFormField(
maxLines: maxLines,
decoration: InputDecoration(
hintText: 'Enter Summary',
contentPadding: new EdgeInsets.symmetric(
vertical: 25.0, horizontal: 10.0),
),
initialValue: widget.postid.data['Summary'],
onChanged: (value) {
this.Summary = value;
},
),
),
SizedBox(height: 5.0),
SizedBox(height: 5.0),
TextFormField(
decoration: InputDecoration(
hintText: 'Task to be given to',
contentPadding: new EdgeInsets.symmetric(
vertical: 25.0, horizontal: 10.0),
),
initialValue: widget.postid.data['Taskgivento'],
//TODO: use tagging system or search when typed system
onChanged: (value) {
this.Taskgivento = value;
},
),
SizedBox(height: 5.0),
TextFormField(
decoration: InputDecoration(
hintText: 'Status',
contentPadding: new EdgeInsets.symmetric(
vertical: 25.0, horizontal: 10.0),
),
initialValue: widget.postid.data['Status'],
onChanged: (value) {
this.Status = value;
},
),
DateTimeField(
format: dateformat,
onShowPicker: (context, currentValue) {
return showDatePicker(
context: context,
firstDate: DateTime(1900),
initialDate: currentValue ?? DateTime.now(),
lastDate: DateTime(2100));
},
decoration: InputDecoration(
hintText: 'Enter Date to be completed',
contentPadding: new EdgeInsets.symmetric(
vertical: 25.0, horizontal: 10.0),
),
initialValue: widget.postid.data['Completion'].toDate(),
onChanged: (value) {
this.Completion = value;
},
),
SizedBox(height: 25.0),
SizedBox(
width: 90.0,
height: 50.0,
child: FlatButton(
//color: Colors.blue,
padding: EdgeInsets.all(8.0),
child: Text('Update Task'),
onPressed: () {
Firestore.instance.collection('Task').document(_postdocid()).updateData({
'Title': this.Title,
'Summary': this.Summary,
'Taskgivento': this.Taskgivento,
'Status': this.Status,
'Completion': this.Completion,
});
Navigator.of(context).pop();
},
),
)
],
),
),
),
));
}
}
我有五个可以编辑的字段,但是说用户只编辑“标题”字段并按“更新”按钮,然后其余字段将保存为null,因为它们没有更改。 但是我想和他们以前的值(初始值)一样。 我试图使用if else语句进行更改,但这不起作用。 我该怎么做才能做到这一点?
答案 0 :(得分:1)
更新文档时,Firestore会将在该调用中指定的字段设置为指定的值。因此,如果不应更新字段,则应不将其包含在通话中。
这意味着您应该仅构建具有 新值的字段的映射,并将该映射传递给Firestore。像这样:
Map<String, Object> data = new HashMap();
if (this.Title) data['Title'] = this.Title;
if (this.Summary) data['Summary'] = this.Summary;
if (this.Taskgivento) data['Taskgivento'] = this.Taskgivento;
if (this.Status) data['Status'] = this.Status;
if (this.Completion) data['Completion'] = this.Completion;
Firestore.instance.collection('Task').document(_postdocid()).updateData(data);