Flutter中User类未初始化问题:Getter/Setter无法获取值
问题分析与解决方案
核心问题:每次创建新的User实例
你现在每次调用User()都会生成一个全新的对象,注册页面设置的是这个新实例的属性,回到个人资料页面再调用User()又是另一个新实例,自然拿不到之前设置的值;如果类的字段是非可空类型且未初始化,访问时还会触发“未初始化”崩溃。
1. 让User类成为单例(确保全局唯一实例)
把User改成单例模式,这样整个应用里不管哪里调用User(),都是同一个对象,注册时设置的值在个人资料页面就能获取到。示例代码:
class User { // 全局唯一实例 static final User _singleton = User._internal(); // 工厂构造函数,返回单例 factory User() { return _singleton; } // 私有构造函数,防止外部创建新实例 User._internal(); // 用可空字段避免未初始化问题 String? _name; // Getter String? get name => _name; // Setter set setName(String value) { _name = value; } }
注册页面代码保持不变(现在设置的是单例的属性):
User().setName = usernameController.text;
2. 安全检查字段是否初始化
因为字段改成了可空类型String?,可以直接判断是否为null,结合非空判断来安全访问:
个人资料页面代码修改为:
final user = User(); if (user.name != null && user.name!.isNotEmpty) { print('user email from get: ${user.name}'); }
如果不想用可空类型,也可以给字段设置默认空字符串,这样直接用isNotEmpty判断即可:
class User { static final User _singleton = User._internal(); factory User() => _singleton; User._internal(); String _name = ''; // 默认空字符串 String get name => _name; set setName(String value) => _name = value; }
此时个人资料页面的判断可以简化为:
if (User().name.isNotEmpty) { print('user email from get: ${User().name}'); }
补充:关于实例识别
改成单例后,注册和个人资料页面使用的是同一个User对象,程序能识别到属性的变化,返回个人资料页面时就能直接显示最新设置的值。
内容的提问来源于stack exchange,提问作者Robban13
相关产品推荐
相关产品推荐

