Flutter Flatter Firestore前端-创建用于添加字段的UI
我的任务是创建云Firestore的移动前端。充其量,它应该是web UI的镜像副本。用户应该能够添加集合、文档和字段。我一直被困在球场上。我创建了一个_renderWidget()函数来将适当的小部件绘制到屏幕上,但它不适用于数组和贴图Flutter Flatter Firestore前端-创建用于添加字段的UI,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,我的任务是创建云Firestore的移动前端。充其量,它应该是web UI的镜像副本。用户应该能够添加集合、文档和字段。我一直被困在球场上。我创建了一个_renderWidget()函数来将适当的小部件绘制到屏幕上,但它不适用于数组和贴图 @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Add field'),
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Add field'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.save),
onPressed: () async {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
await Firestore.instance
.collection('users')
.document(user.uid)
.collection('collections')
.document('myCollections')
.collection(widget.collectionName)
.document(widget.documentName)
.updateData({_field: _valueName});
}
Navigator.pop(context);
},
)
],
),
body: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Field'),
TextFormField(
decoration: const InputDecoration(
hintText: 'Enter the field name',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return _field;
},
onSaved: (String value) {
_field = value;
},
),
Text('Type'),
DropdownButton<String>(
value: dropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String newValue) {
//String setWidget;
setState(() {
dropdownValue = newValue;
if (newValue == 'string') {
setState(() {
setWidget = 'string'; // A, B or C
});
} else if (newValue == 'number') {
setState(() {
setWidget = 'number';
});
} else if (newValue == 'boolean') {
setState(() {
setWidget = 'boolean';
});
} else if (newValue == 'map') {
setState(() {
setWidget = 'map';
});
} else if (newValue == 'array') {
setState(() {
setWidget = 'array';
});
} else if (newValue == 'null') {
setState(() {
setWidget = 'null';
});
} else if (newValue == 'timestamp') {
setState(() {
setWidget = 'timestamp';
});
} else if (newValue == 'geopoint') {
setState(() {
setWidget = 'geopoint';
});
} else if (newValue == 'reference') {
setWidget = 'reference';
}
});
},
items: <String>[
'string',
'number',
'boolean',
'map',
'array',
'null',
'timestamp',
'geopoint',
'reference',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
Column(children: _buildCards(stringMap)),
],
),
),
);
}
_renderWidget() {
if (setWidget == 'string') {
return TextFormField(
decoration: const InputDecoration(
hintText: 'Enter the value',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return _valueName;
},
onSaved: (String value) {
_valueName = value;
},
);
} else if (setWidget == 'number') {
return TextFormField(
decoration: const InputDecoration(
hintText: 'Enter a number',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
} else if (value is String) {
return 'Must be a number';
}
return _valueName;
},
onSaved: (String value) {
_valueName = value;
},
);
} else if (setWidget == 'boolean') {
return DropdownButton<String>(
value: booleanDropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String newValue) {
setState(() {
booleanDropdownValue = newValue;
if (newValue == 'true') {}
});
},
items: <String>[
'true',
'false',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
);
} else if (setWidget == 'map') {
return Form(
key: _mapFormKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('Field'),
TextFormField(
decoration: const InputDecoration(
hintText: 'Enter the field name',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return _field;
},
onSaved: (String value) {
_field = value;
},
),
Text('Type'),
DropdownButton<String>(
value: mapDropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String newValue) {
setState(() {
mapDropdownValue = newValue;
if (newValue == 'string') {
setState(() {
setMapWidget = 'string'; // A, B or C
});
} else if (newValue == 'number') {
setState(() {
setMapWidget = 'number';
});
} else if (newValue == 'boolean') {
setState(() {
setMapWidget = 'boolean';
});
} else if (newValue == 'map') {
setState(() {
setMapWidget = 'map';
});
} else if (newValue == 'array') {
setState(() {
setMapWidget = 'array';
});
} else if (newValue == 'null') {
setState(() {
setMapWidget = 'null';
});
} else if (newValue == 'timestamp') {
setState(() {
setMapWidget = 'timestamp';
});
} else if (newValue == 'geopoint') {
setState(() {
setMapWidget = 'geopoint';
});
} else if (newValue == 'reference') {
setMapWidget = 'reference';
}
});
},
items: <String>[
'string',
'number',
'boolean',
'map',
'array',
'null',
'timestamp',
'geopoint',
'reference',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
Container(child: _renderWidget(),)
],
),
);
} else if (setWidget == 'array') {
return Column(
children: <Widget>[
DropdownButton<String>(
value: dropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (String newValue) {
setState(() {
dropdownValue = newValue;
if (newValue == 'string') {
setState(() {
setWidget = 'string'; // A, B or C
});
} else if (newValue == 'number') {
setState(() {
setWidget = 'number';
});
} else if (newValue == 'boolean') {
setState(() {
setWidget = 'boolean';
});
} else if (newValue == 'map') {
setState(() {
setWidget = 'map';
});
} else if (newValue == 'array') {
setState(() {
setWidget = 'array';
});
} else if (newValue == 'null') {
setState(() {
setWidget = 'null';
});
} else if (newValue == 'timestamp') {
setState(() {
setWidget = 'timestamp';
});
} else if (newValue == 'geopoint') {
setState(() {
setWidget = 'geopoint';
});
} else if (newValue == 'reference') {
setWidget = 'reference';
}
});
},
items: <String>[
'string',
'number',
'boolean',
'map',
'array',
'null',
'timestamp',
'geopoint',
'reference',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
Container(child: _renderWidget()),
],
);
} else if (setWidget == 'null') {
return; // onSaved: _valueName = null;
} else if (setWidget == 'timestamp') {
return Column(
children: <Widget>[
Text('Date'),
TextFormField(
decoration: const InputDecoration(
hintText: 'MM/DD/YYYY',
),
validator: (value) {
if (value.isEmpty) {
return 'Please enter some text';
}
return null;
},
onSaved: (String value) {
//_date = value;
},
),
Text('Time'),
TextFormField(decoration: const InputDecoration(
hintText: '00:00:00000',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return null;
},
onSaved: (String value) {
//_time = value;
},
),
],
);
} else if (setWidget == 'geopoint') {
return Column(
children: <Widget>[
Text('Latitude'),
TextFormField(
decoration: const InputDecoration(
hintText: '0',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return null;
},
onSaved: (String value) {
//_date = value;
},
),
Text('Longitude'),
TextFormField(decoration: const InputDecoration(
hintText: '0',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return null;
},
onSaved: (String value) {
//_time = value;
},
),
],
);
} else if (setWidget == 'reference') {
return Column(
children: <Widget>[
Text('Document path'),
TextFormField(decoration: const InputDecoration(
hintText: 'Ex: collection/document001/',
),
validator: (value) {
if (value.isEmpty) {
return 'Required';
}
return null;
},
onSaved: (String value) {
//_time = value;
},
),
],
);
}
}
@覆盖
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“添加字段”),
行动:[
图标按钮(
图标:图标(Icons.save),
onPressed:()异步{
if(_formKey.currentState.validate()){
_formKey.currentState.save();
等待Firestore.instance
.collection('用户')
.document(user.uid)
.collection(“collections”)
.文件(“myCollections”)
.collection(widget.collectionName)
.document(widget.documentName)
.updateData({u字段:{u valueName});
}
Navigator.pop(上下文);
},
)
],
),
正文:表格(
键:_formKey,
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本(“字段”),
TextFormField(
装饰:常量输入装饰(
hintText:'输入字段名',
),
验证器:(值){
if(value.isEmpty){
返回“必需”;
}
返回_字段;
},
onSaved:(字符串值){
_字段=值;
},
),
文本(“类型”),
下拉按钮(
value:dropdownValue,
图标:图标(图标。向下箭头),
iconSize:24,
海拔:16,
样式:TextStyle(颜色:Colors.deepPurple),
下划线:容器(
身高:2,
颜色:颜色。深紫色,
),
onChanged:(字符串newValue){
//字符串设置控件;
设置状态(){
dropdownValue=newValue;
如果(newValue=='string'){
设置状态(){
setWidget='string';//A、B或C
});
}else if(newValue=='number'){
设置状态(){
setWidget='number';
});
}else if(newValue=='boolean'){
设置状态(){
setWidget='boolean';
});
}else if(newValue=='map'){
设置状态(){
setWidget='map';
});
}else if(newValue=='array'){
设置状态(){
setWidget='array';
});
}else if(newValue='null'){
设置状态(){
setWidget='null';
});
}else if(newValue=='timestamp'){
设置状态(){
setWidget='timestamp';
});
}else if(newValue=='geopoint'){
设置状态(){
setWidget='geopoint';
});
}else if(newValue=='reference'){
setWidget='reference';
}
});
},
项目:[
'字符串',
“数字”,
'布尔',
“地图”,
“数组”,
“空”,
“时间戳”,
“地质点”,
“参考”,
].map((字符串值){
返回下拉菜单项(
价值:价值,
子项:文本(值),
);
}).toList(),
),
列(子项:_buildCards(stringMap)),
],
),
),
);
}
_renderWidget(){
如果(setWidget=='string'){
返回TextFormField(
装饰:常量输入装饰(
hintText:'输入值',
),
验证器:(值){
if(value.isEmpty){
返回“必需”;
}
返回_valueName;
},
onSaved:(字符串值){
_valueName=值;
},
);
}else if(setWidget=='number'){
返回TextFormField(
装饰:常量输入装饰(
hintText:'输入一个数字',
),
验证器:(值){
if(value.isEmpty){
返回“必需”;
}else if(值为字符串){
返回“必须是一个数字”;
}
返回_valueName;
},
onSaved:(字符串值){
_valueName=值;
},
);
}else if(setWidget=='boolean'){
返回下拉按钮(
值:booleanDropdownValue,
图标:图标(图标。向下箭头),
iconSize:24,
海拔:16,
样式:TextStyle(颜色:Colors.deepPurple),
下划线:容器(
身高:2,
颜色:颜色。深紫色,
),
onChanged:(字符串newValue){
设置状态(){
booleanDropdownValue=新值;
如果(newValue='true'){}
});
},
项目:[
“真的”,
“假”,
].map((字符串值){
返回下拉菜单项(
价值:价值,
子项:文本(值),
);
}).toList(),
);
}else if(setWidget=='map'){
报税表(
键:_mapFormKey,
子:列(
crossAxisAlignment:crossAxisAlignment.start,