我有两个Flutter下拉菜单。第一个从数据库加载大学列表,并且运行良好。第二个从数据库加载所选大学的校园。
目前,我正在使用大学下拉菜单的onChanged()函数中的setState(),该函数在80%的时间内有效。其余20%似乎是由于网络速度较慢所致,因此下拉菜单在屏幕刷新之前没有时间进行填充,因此没有显示。如果单击大学下拉菜单,通常将填充两次或三次校园下拉菜单。这是加载代码(其中loadDatabaseSubTable()填充校园下拉列表:
Container(
decoration: new BoxDecoration(
border: Border.all(width: 1),
borderRadius: new BorderRadius.all(Radius.circular(5.0)),
shape: BoxShape.rectangle,
),
padding: EdgeInsets.symmetric(
horizontal: kContainerPaddingHorizontal,
vertical: kContainerPaddingVertical),
child: DropdownButton<String>(
hint: Text('Select the Institution'),
value: selectedInstitute,
underline: Container(
height: 0,
),
onChanged: (String value) {
// Use setState() to load next dropdown
if (institutionBefore != value) {
setState(() {
// Get matching campuses
dropCampus = [];
campusBuild.institutionId = shInstitutionId;
campusBuild.campusId = '';
loadDatabaseSubTable(
tableName: 'sa_campus_by_institute',
listVariable: dropCampus,
object: campusBuild);
//
selectedInstitute = value;
});
}
},
items: dropInstitution.map((String description) {
return DropdownMenuItem<String>(
value: description,
child: Text(
description,
style: TextStyle(color: Colors.black),
),
);
}).toList(),
),
),
以上方法是解决此问题的正确方法吗?如果是这样,如何确保在下拉列表填满之前没有刷新?
或者使用FutureBuilder处理它更好吗?
我曾考虑过将所有大学的所有校园首先加载到内存中-但要加载Android应用程序。这似乎对带宽使用来说是过大的。
我有另一个屏幕,其中有6个下拉菜单,每个都取决于上一个下拉菜单-为每个屏幕使用FutureBuilder似乎是一种处理处理下拉菜单的非常不整洁的方法。预先感谢。
问题是loadDatabaseSubTable是异步的,您没有等待它完成,所以在它获取setState将会被执行的数据时。
您需要将onChanged
更改为异步:
onChanged: (String value) async {
然后等待loadDatabaseSubTable:
await loadDatabaseSubTable(
tableName: 'sa_campus_by_institute',
listVariable: dropCampus,
object: campusBuild);
另请参见