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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:10:05