【问题标题】:Flutter Dart Singleton Data 'Lost'颤振飞镖单例数据“丢失”
【发布时间】:2018-06-17 07:59:15
【问题描述】:

我想使用以下类来存储帐户数据,以便应用的每个部分都可以访问它。

class AccountData {
  static AccountData _instance = new AccountData._internal();

  static GoogleSignInAccount _googleData;

  factory AccountData() {
    return _instance;
  }

  AccountData._internal();

  static void setData(GoogleSignInAccount googleData)
  {
    _googleData = googleData;
  }

  GoogleSignInAccount get getData{
    return _googleData;
  }

  String getUserID(){
    return "5";
  }

  List<Workout> getWorkouts(){
    return null;
  }

  Workout getWorkoutByDate(String workoutID, String date)
  {
    return null;
  }
}

我在用户登录后使用以下代码设置了 google 帐户。

 _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account) {
      AccountData.setData(account);

      print("Logged in, id: " + account.id);
      runApp(new HomeState());
    });

此时我可以访问帐户的所有字段并且一切正常。绕过登录屏幕的唯一方法是通过这部分代码。因此,总是会分配帐户数据。

@override
  void initState() {
    super.initState();

    AccountData d = new AccountData();
    print(d.getData);
}

如果我尝试访问 HomeState 中的帐户数据,则返回的 GoogleSignInAccount 为 null,这是不应该的。 我希望有人知道为什么会发生这种情况并知道如何解决问题。

【问题讨论】:

    标签: dart singleton flutter


    【解决方案1】:

    您将数据存储在来自静态方法AccountData.setData(account);的类的静态变量中

    您还应该静态访问数据以恢复它们:

    AccountData.getData();

    之前需要在类体中将方法定义为静态:

    static GoogleSignInAccount get getData{
        return _googleData;
    }
    

    那么,由于 _googleData 的所有内容都是静态的,因此您无需创建 AccountData 实例。

    否则,您可以将它们全部更改为实例变量和方法,并且您应该预先创建实例。

    【讨论】:

    • 我将 getter 和 setter 都更改为静态方法,并相应地调整了方法调用。但是,一旦我尝试访问 HomeState 中的谷歌数据,它仍然为空。在运行 HomeState 之前访问数据会返回实际数据。
    • 不看应用流程就很难说了。也许你应该尝试在应用程序的开头获取AccounData 的实例。
    • 顺便问一下,在收到异步_googleSignIn 帐户信息之前是否调用了initState()?如果是这样,数据为空是正常的。
    • 在运行应用程序后调用初始化状态,因此已收到 _googleSignIn。我还可以在 runApp(new HomeState()) 执行之前打印所有数据(并获取有效值)。
    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 2020-12-25
    • 2020-11-05
    • 2022-01-21
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    相关资源
    最近更新 更多