假设我有三个文件:main.dart、LoginScreen.dart、HomePageScreen.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;
}
}
这实际上只是改变了用户的内容。这样我可以将用户更新为新创建的用户。然而,我的直觉告诉我,这是解决这个问题的一种非常糟糕的方法。我觉得问题出在逻辑上,我试图实现注册/登录功能的方式。
概括:
有没有办法改变提供者中值的引用?如果这是不可能的,或者使用提供商架构的方式不好,您对如何实现注册功能有任何建议吗