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

Flutter中Isar数据库增删改函数报错问题求助

问题解决:Flutter Isar数据库操作函数类型不匹配报错

错误分析

你遇到的The argument type 'Future Function(dynamic)' can't be assigned to the parameter type 'Future Function()'错误,根源有两个:

  1. writeTxn回调类型不匹配:你给writeTxn传递了带Isar参数的闭包,但当前Isar版本的writeTxn方法期望无参数的异步函数。
  2. deleteUser方法调用错误:Isar的delete接口需要传入用户的Id值,而非整个User对象。

修正后的操作函数代码

// User实体类(无需修改)
@Collection()
class User {
  Id? id = Isar.autoIncrement;

  @Index(unique: true)
  String? username;

  String? password;

  bool? isAdmin;

  User({
    this.id,
    this.username,
    this.password,
    this.isAdmin,
  });
}

// 修正后的数据库操作函数
static Future<void> addUser(User user) async {
  await _isar.writeTxn(() async {
    await _isar.user.put(user);
  });
}

static Future<void> updateUser(User user) async {
  await _isar.writeTxn(() async {
    await _isar.user.put(user);
  });
}

static Future<void> deleteUser(User user) async {
  // 先判断id是否存在,避免空指针
  if (user.id != null) {
    await _isar.writeTxn(() async {
      await _isar.user.delete(user.id!);
    });
  }
}

额外优化建议

  • 不要在build方法中执行数据库操作:build会因UI重绘多次调用,建议把初始化用户的逻辑放到StatefulWidget的initState中,或者APP启动时的初始化流程里:
class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();
    _initDefaultUsers();
  }

  Future<void> _initDefaultUsers() async {
    // 检查Admin用户
    final admin = await IsarQueries.getUserByUsername('admin');
    if (admin == null) {
      await IsarQueries.addUser(User(
        username: 'admin',
        password: '1234',
        isAdmin: true,
      ));
    }

    // 检查mms用户
    final mms = await IsarQueries.getUserByUsername('mms');
    if (mms == null) {
      await IsarQueries.addUser(User(
        username: 'mms',
        password: '4321',
        isAdmin: true,
      ));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Fitgate App')),
      body: LoginPage(),
      backgroundColor: Colors.white,
    );
  }
}
  • 处理唯一索引冲突:因为username设为唯一索引,创建用户时可以加异常捕获,避免重复插入导致崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:23:19