Flutter中提交表单时无法将user_id存入flowerbook表的问题
核心问题是你传递的User对象从登录环节开始就没有正确获取/赋值user_id,导致后续菜单页面、表单页面拿到的user.user_id都是NULL,最终插入flowerbook表时违反NOT NULL约束。
以下是具体排查和修复步骤:
1. 验证登录环节的User对象是否正确赋值user_id
登录时从数据库查询用户信息后,必须确保把user表中的user_id字段正确赋值给User对象。示例代码:
// 登录后从数据库结果实例化User对象 Map<String, dynamic> userData = await db.query('user', where: 'username = ?', whereArgs: [username]); User loggedInUser = User( user_id: userData['user_id'], // 关键:必须正确提取数据库中的user_id username: userData['username'], password: userData['password'], f_name: userData['f_name'], l_name: userData['l_name'], email: userData['email'], phone: userData['phone'], ); // 打印确认,此处必须输出非NULL的数字 print("登录用户ID: ${loggedInUser.user_id}");
如果这里打印的user_id是NULL,说明登录查询逻辑有问题,比如查询结果未包含user_id,或者字段名拼写错误。
2. 检查菜单页面接收的User对象是否有效
在菜单页面的初始化阶段打印widget.user.user_id,确认传递到菜单页面的User对象已经有正确的user_id:
@override void initState() { super.initState(); print("菜单页面用户ID: ${widget.user.user_id}"); }
如果这里也是NULL,说明登录后跳转到菜单页面时,传递的User对象本身就有问题,需要检查跳转时的传值代码(比如Navigator.push的参数)。
3. 确认表单页面的传值是否正常
在FormPage的初始化阶段打印widget.user.user_id,确认接收到的User对象包含有效ID:
@override void initState() { super.initState(); print("表单页面用户ID: ${widget.user.user_id}"); }
如果这里还是NULL,说明菜单页面传递给FormPage的User对象丢失了user_id,需要检查User类的定义是否正确(比如字段名是否和数据库一致,是否是可空类型导致赋值丢失)。
4. 检查Flowerbook的数据库插入逻辑
确认Flowerbook.register方法在插入时,正确使用了flowerbook对象的user_id:
- 检查Flowerbook类的
toMap方法,确保包含user_id字段:
Map<String, dynamic> toMap() { return { 'deliver_date': deliver_date, 'arrangement': arrangement, 'flower_type': flower_type, 'user_id': user_id, // 此处不能遗漏,且值必须非空 }; }
- 检查register方法的插入逻辑,确保调用toMap()时没有覆盖user_id:
static Future<void> register(Flowerbook flowerbook) async { final db = await DatabaseHelper.instance.database; await db.insert( 'flowerbook', flowerbook.toMap(), conflictAlgorithm: ConflictAlgorithm.replace, ); }
关键总结
所有问题的源头都是User对象的user_id字段没有被正确初始化或传递,只要确保从登录查询开始,user_id就被正确赋值并在页面间传递,后续插入数据库时就不会出现NULL的情况。
内容的提问来源于stack exchange,提问作者Nad Ham

