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

Flutter注册校验异常:获取用户名列表返回Future实例而非数据

问题解决:Flutter注册时获取用户名列表显示Future实例的问题

核心问题分析

  • DB类的db getter方法逻辑错误,初始化数据库后返回null,导致后续数据库操作异常
  • 调用异步方法getAllUsernames()时未使用await,直接赋值给变量导致始终持有Future实例而非实际数据
  • usernameList从未被赋值为实际的用户名字符串列表,导致重复检查逻辑无效

分步修复

1. 修复DB类的数据库实例获取逻辑

原db getter初始化后错误返回null,修改为返回初始化后的数据库实例:

Future<Database?> get db async {
  if (_db != null) {
    return _db;
  }
  _db = await initDatabase();
  return _db; // 替换原return null
}

同时优化getAllUsernames方法,确保等待数据库初始化完成:

Future<List<ConnectifyModel>> getAllUsernames() async {
  final database = await db;
  final List<Map<String, Object?>> queryResult = await database!.rawQuery(
    "SELECT username FROM users");
  return queryResult.map((e) => ConnectifyModel.fromMap(e)).toList();
}

2. 修复注册页面的用户数据加载逻辑

修改loadUser方法,通过await获取实际数据并提取用户名到usernameList:

loadUser() async {
  List<ConnectifyModel> userList = await db!.getAllUsernames();
  usernameList = userList.map((user) => user.username).toList();
  setState(() {}); // 更新状态触发UI刷新
}

3. 优化用户名重复检查(可选更高效方案)

无需拉取所有用户名,直接查询数据库是否存在目标用户名,减少资源消耗:

先在DB类添加检查方法

Future<bool> isUsernameExists(String username) async {
  final database = await db;
  final List<Map<String, Object?>> result = await database!.rawQuery(
    "SELECT 1 FROM users WHERE username = ?", [username]);
  return result.isNotEmpty;
}

然后修改注册页面的输入监听逻辑

onChanged: (String value) async {
  setState(() {
    _username = value;
  });
  bool exists = await db!.isUsernameExists(value);
  setState(() {
    if (exists) {
      errorUsername = "Такой никнем уже существует";
      isButtonActive = false;
    } else {
      errorUsername = "";
      isButtonActive = true;
    }
  });
},

4. 修复注册按钮的可用性控制

将按钮的onPressed与isButtonActive关联,并补充注册逻辑:

onPressed: isButtonActive ? () async {
  // 校验所有输入字段非空
  if (_name != null && _username != null && _email != null && _password.length >=6 && _city != null && _bithday != null) {
    // 插入用户数据到数据库(需自行实现DB类的insert方法)
    // await db!.insertUser(ConnectifyModel(...));
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()));
  }
} : null,

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:28:09