Flutter Flatter Firestore前端-创建用于添加字段的UI

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'),

我的任务是创建云Firestore的移动前端。充其量,它应该是web UI的镜像副本。用户应该能够添加集合、文档和字段。我一直被困在球场上。我创建了一个_renderWidget()函数来将适当的小部件绘制到屏幕上,但它不适用于数组和贴图

@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,