如何编码依赖于其他下拉菜单的下拉菜单-使用Flutter

问题描述 投票:0回答:1

我有两个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似乎是一种处理处理下拉菜单的非常不整洁的方法。预先感谢。

flutter dart dropdown
1个回答
0
投票

问题是loadDatabaseSubTable是异步的,您没有等待它完成,所以在它获取setState将会被执行的数据时。

您需要将onChanged更改为异步:

onChanged: (String value) async {

然后等待loadDatabaseSubTable:

await loadDatabaseSubTable(
  tableName: 'sa_campus_by_institute',
  listVariable: dropCampus,
  object: campusBuild);

另请参见

© www.soinside.com 2019 - 2024. All rights reserved.