You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中DropdownButton无法显示选中值问题求助

解决Flutter DropdownButton选中后无状态反馈的问题

嘿,我明白你现在遇到的困扰了——选中Dropdown的选项后,控件完全没反应,仿佛没选过一样。咱们来一步步排查解决:

核心问题1:缺失value属性绑定

你代码里把DropdownButton的value: _currentUser给注释掉了!这可是DropdownButton显示选中状态的关键属性,它用来告诉控件当前选中的是哪一项,所以必须把这行注释去掉,让控件能关联上你的_currentUser状态变量。

核心问题2:FutureBuilder重复执行导致状态丢失

每次页面重建(比如调用setState时),你的FutureBuilder都会重新执行db.getUserModelData(),这会重新构建所有Dropdown选项,进而导致选中状态被重置。咱们可以把Future提前初始化,避免重复调用:

额外优化:避免重复插入测试数据

现在你的_saveData()在页面每次初始化时都会插入相同的用户,时间长了数据库里会有一大堆重复数据,建议加个判断逻辑,只在数据库为空时插入测试数据。


修改后的完整代码

import 'dart:convert';
import 'package:sqlliteapp/db_helper.dart';
import 'package:sqlliteapp/user_model.dart';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';

class SqliteDropdown extends StatefulWidget {
  @override
  SqliteDropdownState createState() {
    return new SqliteDropdownState();
  }
}

class SqliteDropdownState extends State<SqliteDropdown> {
  DatabaseHelper db = DatabaseHelper();
  UserModel _currentUser;
  // 提前声明Future变量,避免重复执行数据库查询
  Future<List<UserModel>> _usersFuture;

  //Add data to db - 优化:先检查数据库是否有数据,再插入测试数据
  _saveData() async {
    // 查询现有数据数量(需要你的DatabaseHelper实现getCount方法,或者用其他方式判断是否为空)
    var userCount = await db.getCount();
    if (userCount == 0) {
      UserModel user1 = UserModel(
        "test",
        "test",
        "test@gmail.com",
        "test",
      );
      UserModel user2 = UserModel(
        "test1",
        "test1",
        "test1@gmail.com",
        "test",
      );
      await db.saveData(user1);
      await db.saveData(user2);
    }
  }

  @override
  void initState() {
    super.initState();
    _saveData();
    // 初始化Future,只执行一次
    _usersFuture = db.getUserModelData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Fetching data from Sqlite DB - DropdownButton'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.max,
          children: <Widget>[
            FutureBuilder<List<UserModel>>(
              // 使用提前初始化的Future
              future: _usersFuture,
              builder: (BuildContext context, AsyncSnapshot<List<UserModel>> snapshot) {
                if (!snapshot.hasData) return CircularProgressIndicator();
                return DropdownButton<UserModel>(
                  items: snapshot.data
                      .map((user) => DropdownMenuItem<UserModel>(
                            child: Text(user.name),
                            value: user,
                          ))
                      .toList(),
                  onChanged: (UserModel value) {
                    setState(() {
                      _currentUser = value;
                    });
                  },
                  isExpanded: true,
                  // 恢复value属性绑定,这是显示选中状态的核心
                  value: _currentUser,
                  hint: Text('Select User'),
                );
              }),
            SizedBox(height: 20.0),
            _currentUser != null
                ? Text(
                    "Name: " + _currentUser.name + "\n Email: " + _currentUser.email + "\n Username: " + _currentUser.username + "\n Password: " + _currentUser.password,
                  )
                : Text("No User selected"),
          ],
        ),
      ),
    );
  }
}

效果说明

修改后,当你选中某个用户时:

  • DropdownButton会立即显示选中的用户名作为当前选项
  • 下方的文本区域也会同步更新选中用户的详细信息
  • 数据库不会再重复插入测试数据,避免冗余

内容的提问来源于stack exchange,提问作者Amit Namdeo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:25:40