flutter - Flutter DropdownButtonFormField 不起作用
问题描述
我正在尝试通过从 API 获取值来填充下拉列表。当我单击下拉菜单时,正在显示值,当我尝试选择一个值时,抛出以下错误
items.isEmpty || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.
列表中的值不为空
当我尝试删除下拉列表的“值”属性时,未显示错误,但下拉列表未显示所选值
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:something/Utils/formServices.dart';
import 'package:datetime_picker_formfield/datetime_picker_formfield.dart';
import 'package:intl/intl.dart';
import 'dart:convert';
String insurer;
String package;
List insCat = List();
List insurers = List();
List<DropdownMenuItem> items = [];
class AddOrEditPack extends StatefulWidget{
@override
AddOrEditPackState createState() =>AddOrEditPackState();
}
class AddOrEditPackState extends State<AddOrEditPack>{
final formKey = GlobalKey<FormState>();
String insuranceCategory = ' ';
@override
void initState() {
getCategories();
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Contact Us'),
),
drawer: Drawer(
child: ListView(
children: <Widget>[
ListTile(
title: Text("Home"),
),
],
),
),
body:
Form(
key:formKey,
child: ListView(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 0, 0, 0),
child: DropdownButtonFormField<String>(
hint:Text('Insurance Category'),
items: insCat.map((item) {
return new DropdownMenuItem<String>(
child: new Text(item['name']),
// value: item['name'],
);
}).toList(),
onChanged: (String newValue) {
setState(() { insuranceCategory = newValue; });
print(newValue);
},
// value: insuranceCategory,
),
),
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10,0),
child: RaisedButton(
onPressed: () {
contact();
},
child: Text('Submit'),
),
)
],
),
)
),
);
}
getCategories() async{
var resp = await
http.get('http://192.168.4.101:3000/category/getCategoryList');
print(resp.body);
insCat = json.decode(resp.body);
setState(() {
insuranceCategory=insCat[0]['name'];
});
}
}
这就是 API 返回的内容。
[
{"_id":"5d8dad3a2fcb272b7c0e74b5","name":"life insurance"},
{"_id":"5d8dad502fcb272b7c0e74b6","name":"vehicle insurance"},
{"_id":"5d8dadb22fcb272b7c0e74b9","name":"life insurance"}
]
解决方案
输出:
void main() => runApp(MaterialApp(
title: "Hospital Management",
home: MyApp(),
));
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _mySelection = "2";
final String url = "http://webmyls.com/php/getdata.php";
List data = List(); //edited line
List<DropdownMenuItem> items = [];
Future<String> getSWData() async {
var res = await http.get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
var resBody = json.decode(res.body);
setState(() {
data = resBody;
items = data.map((item) => DropdownMenuItem(child: Text(item['item_name']), value: item['id'].toString())).toList();
_mySelection = data[0]["id"];
});
print(resBody);
return "Sucess";
}
@override
void initState() {
super.initState();
this.getSWData();
}
@override
Widget build(BuildContext context) {
print("CoolTag: ${data.length}");
return Scaffold(
appBar: AppBar(title: Text("Hospital Management")),
body: Center(
child: DropdownButton(
items: items,
value: _mySelection,
onChanged: (newVal) {
setState(() {
_mySelection = newVal;
});
},
),
),
);
}
}
推荐阅读
- c# - Serilog 访问传递给日志记录语句的 LogEvent 中的原始对象
- keycloak - Keycloak CSS 未在浏览器中更新
- javascript - React JS npm start 显示无法编译 web-vitals
- python - 从提供的字符串动态地将关键字及其值添加到 python 函数
- visual-studio-debugging - 使用调试器启动进程
- .net - .Net 5 控制台应用程序,如何针对 ARM 平台?
- javascript - 如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 GET url
- python - 使用 Beautifulsoup 获取 HTML Header 的内容
- reactjs - 时间在 React 中没有正确显示
- python - 慢熊猫扩展().std()窗口函数的替代方法