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

使用Supabase+SQFlite遇类型转换错误:int无法转为String

问题定位与修复方案

错误根源

报错type 'int' is not a subtype of type 'String' in type cast的核心原因:

  • 创建UserModel时未传入Supabase用户的String类型id,导致插入SQFlite时,数据库自动生成了int类型的自增主键id。
  • 在UserModel.fromMap中,强制将json['id']转为String类型,但实际从SQFlite返回的id是int类型,类型不匹配触发错误。

具体修复步骤

1. 传入正确的用户id到UserModel

在_updateProfile方法中,创建UserModel时添加Supabase用户的String类型id:

final UserModel model = UserModel(
    id: user.id, // 新增:传入Supabase用户的String类型id
    username: user!.userMetadata!["username"],
    email: user.email,
    gender: dropdownValue,
    age: int.parse(ageTextEditingController.text.trim()),
    height: int.parse(hightTextEditingController.text.trim()),
    weight: int.parse(weightTextEditingController.text.trim()),
);

2. 修正SQFlite的查询条件

将固定的id=1查询改为用当前Supabase用户的id作为条件,保证匹配String类型主键:

Future<UserModel?> getDatabaseModelWithId() async {
  try {
    final db = await getDB();
    final currentUserId = supabase.auth.currentUser?.id;
    if (currentUserId == null) return null;
    
    var response = await db.query(
      'User',
      where: 'id = ?', // 使用占位符避免SQL注入
      whereArgs: [currentUserId],
    );

    print(response);

    if (response.isNotEmpty) {
      final userModel = UserModel.fromMap(response.first);
      print('userModel: $userModel');
      return userModel;
    } else {
      print('No data found for id = $currentUserId');
      return null;
    }
  } catch (e) {
    print('Error in getDatabaseModelWithId: $e');
    return null;
  }
}

3. 确保SQFlite表结构的id字段类型正确

检查并修改表创建语句,保证id字段为TEXT类型(匹配Supabase的String类型id):

CREATE TABLE IF NOT EXISTS User (
  id TEXT PRIMARY KEY,
  username TEXT,
  email TEXT,
  weight INTEGER,
  height INTEGER,
  gender TEXT,
  age INTEGER
);

若之前表结构为INTEGER类型id,需删除旧表后重新创建,或做数据迁移。

4. (可选)添加安全的类型转换逻辑

在UserModel.fromMap中增加类型检查,避免类似类型不匹配问题:

factory UserModel.fromMap(Map<String, dynamic> json) {
  return UserModel(
    id: json['id'] is int ? json['id'].toString() : json['id'] as String?,
    username: json['username'] as String?,
    email: json['email'] as String?,
    weight: json['weight'] as int?,
    height: json['height'] as int?,
    age: json['age'] as int?,
    gender: json['gender'] as String?,
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:55