1

假设我有三个文件:main.dartLoginScreen.dartHomePageScreen.dart。我正在利用Provider架构进行状态管理和包装 MaterialApp。

当应用启动时,main.dart 文件会检查用户是否已经登录(FirebaseAuth.currentUser 来检查这个)。如果已登录,则导航到 HomePageScreen,如果未登录,则导航到 SignUpScreen。代码上是这样的:

// Inside of main
AppUser user = await database.getCurrentUser(); // user == null if no fbAuth.currentUser
runApp(MultiProvider(
    providers: [,
      ChangeNotifierProvider(create: (context) => user),
      // some other notifier providers,
    ],
    child: MyApp(),
  ));



// Inside of MyApp
@override
Widget build(BuildContext context) {
   return MaterialApp(
      ...
      home: user == null ? SignupScreen() : HomePageScreen();
   );
}

这很棒,它按我的预期工作。如果 currentUser 为 null,则导航到 SignupScreen,如果不是,则导航到 HomePageScreen。

问题:

在 HomepageScreen 中,它侦听 User 提供程序并相应地更新 UI 组件。因此,当用户成功注册新帐户或登录时,我想在提供程序中更改/更新用户的内容,以便当应用程序屏幕从 SignupScreen 切换到 HomePageScreen 时,它会在 HomePageScreen 上显示正确的信息. 但是,我找不到更改提供者内部用户引用的方法。

我尝试过的事情:

在 AppUser.dart 中,我创建了更改用户引用的方法:

class AppUser with ChangeNotifier {
   String username, email, password;
   
   void changeReference(AppUser newlyCreatedUser) {
      this.username = newlyCreatedUser.username;
      this.password = newlyCreatedUser.password;
      this.email = newlyCreatedUser.email;
   }
}

这实际上只是改变了用户的内容。这样我可以将用户更新为新创建的用户。然而,我的直觉告诉我,这是解决这个问题的一种非常糟糕的方法。我觉得问题出在逻辑上,我试图实现注册/登录功能的方式。

概括:

有没有办法改变提供者中值的引用?如果这是不可能的,或者使用提供商架构的方式不好,您对如何实现注册功能有任何建议吗

4

0 回答 0