Flutter 带firestore的相关颤振下拉按钮
你能分享一个由Flatter中firestore支持的级联下拉列表的例子吗?我需要密码。Flutter 带firestore的相关颤振下拉按钮,flutter,cascade,dropdownbutton,Flutter,Cascade,Dropdownbutton,你能分享一个由Flatter中firestore支持的级联下拉列表的例子吗?我需要密码。 谢谢请检查以下代码 class ListBoxDTO { String iD; String name; ListBoxDTO({this.iD, this.name}); ListBoxDTO.fromJson(Map<String, dynamic> json) { iD = json['ID']; name = json['name']; }
谢谢请检查以下代码
class ListBoxDTO {
String iD;
String name;
ListBoxDTO({this.iD, this.name});
ListBoxDTO.fromJson(Map<String, dynamic> json) {
iD = json['ID'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['ID'] = this.iD;
data['name'] = this.name;
return data;
}
}
enum Loading {
LOADING, SUCCESS, FAILED
}
class ListDropDown extends StatefulWidget {
Function onChanged;
String selectedOpt;
ListDropDown({@required this.onChanged, @required this.selectedOpt,});
@override
_ListDropDownState createState() => _ListDropDownState();
}
class _ListDropDownState extends State<ListDropDown> {
Loading listLoading = Loading.SUCCESS;
List<DropdownMenuItem<String>> dropDownMenu = List<DropdownMenuItem<String>>();
GlobalKey _dropDownKey = GlobalKey();
@override
void initState() {
super.initState();
getListData();
}
@override
Widget build(BuildContext context) {
return Container(constraints: BoxConstraints(minHeight: 40.0,maxHeight: 40.0),
decoration: BoxDecoration(
color: widget.fillColor != null ? Color(widget.fillColor) : Colors.transparent,
border: Border.all(color: Colors.grey, width: 0.0),
borderRadius: BorderRadius.all(Radius.circular(6.0))),
padding: EdgeInsets.only(top: 0.0, bottom: 0.0, left: 8.0, right: 8.0),
child: Row(
children: <Widget>[
loadingProgressIndicator(getListData, listLoading),
Expanded(
flex: 1,
child: DropdownButton<String>(
underline: Container(),
key: _dropDownKey,
isExpanded: true,
items: dropDownMenu,
onChanged: widget.onChanged,
value: widget.selectedOpt,
),
),
],
),
);
}
void getListData() {
setState(() {
listLoading = Loading.LOADING;
});
(Firebase Data Request).then((List<ListBoxDTO> list) {
if (list == null) {
setState(() {
listLoading = Loading.FAILED;
});
} else if (list.length > 0) {
setState(() {
listLoading = Loading.SUCCESS;
});
_getMenu(list);
} else {
setState(() {
listLoading = Loading.SUCCESS;
});
}
});
}
void _getMenu(List<ListBoxDTO> options) {
setState(() {
if (options != null && options.length > 0) {
options.forEach((data) => dropDownMenu.add(
DropdownMenuItem<String>(
value: "${data.iD}",
child: getTextView(
context: context,
text: data.name.toString(),
maxLines: 1),
),
));
setState(() {
widget.onChanged(options[0].iD);
});
}
});
}
Widget loadingProgressIndicator(Function functionName, Loading loading) {
if (loading == Loading.LOADING) {
return Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
width: 18.0,
height: 18.0,
child: CircularProgressIndicator(
strokeWidth: 1.5,
),
),
],
);
} else if (loading == Loading.SUCCESS) {
return Container();
} else {
return IconButton(
icon: Icon(
Icons.warning,
color: Colors.redAccent,
),
onPressed: () {
functionName();
},
);
}
}
}
类ListBoxDTO{
字符串iD;
字符串名;
ListBoxDTO({this.iD,this.name});
ListBoxDTO.fromJson(映射json){
iD=json['iD'];
name=json['name'];
}
映射到JSON(){
最终地图数据=新地图();
数据['ID']=this.ID;
数据['name']=this.name;
返回数据;
}
}
枚举加载{
加载,成功,失败
}
类ListDropDown扩展StatefulWidget{
功能改变;
字符串selectedOpt;
ListDropDown({@required this.onChanged,@required this.selectedOpt,});
@凌驾
_ListDropDownState createState();
}
类_ListDropDownState扩展状态{
加载列表加载=加载成功;
列表下拉菜单=列表();
GlobalKey _dropDownKey=GlobalKey();
@凌驾
void initState(){
super.initState();
getListData();
}
@凌驾
小部件构建(构建上下文){
返回容器(约束:BoxConstraints(最小高度:40.0,最大高度:40.0),
装饰:盒子装饰(
颜色:widget.fillColor!=null?颜色(widget.fillColor):Colors.transparent,
边框:边框。全部(颜色:颜色。灰色,宽度:0.0),
borderRadius:borderRadius.all(半径.圆形(6.0)),
填充:仅限边设置(顶部:0.0,底部:0.0,左侧:8.0,右侧:8.0),
孩子:排(
儿童:[
loadingProgressIndicator(getListData,listLoading),
扩大(
弹性:1,
孩子:下拉按钮(
下划线:Container(),
键:_下拉键,
是的,
项目:下拉菜单,
onChanged:widget.onChanged,
值:widget.selectedOpt,
),
),
],
),
);
}
void getListData(){
设置状态(){
listLoading=加载。加载;
});
(Firebase数据请求)。然后((列表){
if(list==null){
设置状态(){
listLoading=Loading.FAILED;
});
}否则如果(list.length>0){
设置状态(){
listLoading=Loading.SUCCESS;
});
_获取菜单(列表);
}否则{
设置状态(){
listLoading=Loading.SUCCESS;
});
}
});
}
void\u getMenu(列表选项){
设置状态(){
如果(选项!=null&&options.length>0){
options.forEach((数据)=>dropDownMenu.add(
下拉菜单项(
值:“${data.iD}”,
子:getTextView(
上下文:上下文,
text:data.name.toString(),
最大线:1),
),
));
设置状态(){
widget.onChanged(选项[0].iD);
});
}
});
}
Widget loadingProgressIndicator(函数名、加载){
如果(加载==加载.加载){
返回行(
mainAxisSize:mainAxisSize.min,
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
大小盒子(
宽度:18.0,
身高:18.0,
子对象:循环压缩机指示器(
冲程宽度:1.5,
),
),
],
);
}else if(加载==加载.成功){
返回容器();
}否则{
返回图标按钮(
图标:图标(
图标。警告,
颜色:Colors.redAccent,
),
已按下:(){
函数名();
},
);
}
}
}
谢谢@Nilesh Senta的代码。但非常抱歉,我无法使用您的代码。请将完整代码与名称空间(如导入文件--)共享好吗?