问题描述
我正在从SQLite数据库填充城市名称,并尝试显示为下拉列表.我通过遵循一个教程使它起作用,但是有一个小问题.所选值未显示在下拉列表中,而是继续显示默认提示值.但是,我可以分配和检索正确的选定值.
I'm populating cities name from SQLite database and trying to display as a drop down list. I make it work by following a tutorial, but having a small issue. The selected value is not displayed in dropdown, it keep displaying default hint value. However, I was able to assign and retrieve correct selected value.
这是我的代码:
cities.dart
class Cities {
int id;
String name;
Cities(this.id, this.name);
Cities.fromMap(Map<String, dynamic> json) {
this.id = json["id"];
this.name = json["name"];
}
Map<String, dynamic> toMap() => {
'id': null,
'name': name,
};
}
Function
从db检索并返回值:
Function
that retrieve and returns value from db:
Future<List<Cities>> getCitiesList() async {
Database db = await instance.database;
final citiesData = await db.query('cities');
if (citiesData.length == 0) return null;
List<Cities> citiesList = citiesData.map((item) {
return Cities.fromMap(item);
}).toList();
return citiesList;
}
构建的代码在Widget build
内的下拉列表中:
The code which builds drop down, inside Widget build
:
//these are defined above in the code
Cities _city;
final databaseHelper = DatabaseHelper.instance;
FutureBuilder<List<Cities>>(
future: databaseHelper.getCitiesList(),
builder: (BuildContext context, AsyncSnapshot<List<Cities>> snapshot) {
if (!snapshot.hasData) return CircularProgressIndicator();
return DropdownButton<Cities>(
items: snapshot.data
.map((city) => DropdownMenuItem<Cities>(
child: Text(city.name),
value: city,
))
.toList(),
onChanged: (Cities value) {
setState(() {
_city = value;
});
},
isExpanded: true,
// value: _city, //uncommenting this line breaks the layout
hint: Text('Select City'),
);
},
),
控制台中的错误:
'package:flutter/src/material/dropdown.dart': Failed assertion: line 620 pos 15: 'items == null || items.isEmpty || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1': is not true.
取消对此value: _city,
的注释会在显示中添加相同的错误(显示8次错误,而不是下拉列表).
Un-commenting this value: _city,
add same error in display (displays error 8 times, instead of dropdown list).
问题:
- 如何解决此问题?
- 如何从列表中设置默认值? (默认情况下会选中)
推荐答案
您可以通过简单的方式完成操作,只需创建一个简单的字符串列表并将该列表传递到下拉菜单即可.
You can do it in simple way, just create a simple list of strings and pass that list to dropdown menu.
方法如下:
-
更新您的
getCitiesList()
函数:
Future<List<String>> getCitiesList() async {
Database db = await instance.database;
final citiesData = await db.query(tblCities);
if (citiesData.length == 0) return null;
return citiesData.map((Map<String, dynamic> row) {
return row["name"] as String;
}).toList();
}
将此添加到您的表单页面中:
Add this inside your form page:
//initialize these at top
List<String> _citiesList = <String>[];
String _city;
void _getCitiesList() async {
final List<String> _list = await databaseHelper.getCitiesList();
setState(() {
_citiesList = _list;
});
}
在initState()
内部调用_getCitiesList();
.
Call _getCitiesList();
inside initState()
.
将此添加到您的build
方法中:
Add this inside your build
method:
DropdownButtonHideUnderline(
child: DropdownButton<String>(
value: _city,
items: _citiesList.map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (String newValue) {
setState(() {
_city = newValue;
});
},
)),
这篇关于Flutter:选定的值未显示在下拉列表中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!