我在flutter应用程序中使用provider进行状态管理。我使用Multiprovider实现了提供程序。当用户从应用程序注销时,我想擦除提供商数据,我已经读出了this评论,但不太理解。
Multiprovider
tf7tbtn21#
如果您使用不同的密钥重新构建MultiProvider小部件,它会重置状态,因此需要重新构建提供程序。这就是那里解释的。因此,为了实现它,你需要做的是:
MultiProvider
String userId = myUserId; void signOut() { setState(() => userId = ''); } Widget build(BuildContext context) { return MultiProvider( key: ObjectKey(userId), providers: // Your providers child: SomeSubtree(), ); }
假设您使用的是StatefulWidget,在本例中。您可以阅读更多关于Flutter here中键的工作原理。
StatefulWidget
zvms9eto2#
其思想是在用户希望注销时清除状态,主要是通过将令牌设置为null此外,如果您将这些用户数据存储在设备中,则应清除它们。我用sharedprefrences。我的代码示例
Future<void> logOut() async { _token = null; notifyListeners(); final prefs = await SharedPreferences.getInstance(); prefs.clear(); }
如果您存储了其他数据,也将其设置为null,并确保在将这些数据设置为null后notifyListeners。我想您已经正确地完成了多提供程序,所以我只让您知道如何完成注销
xdyibdwo3#
问题是当用户A注销,然后用户B登录时,用户A的旧数据仍然在这里。为了解决这个问题,我有三个解决方案:1/.在update的每个ChangeNotifierProxyProvider中,必须检查登录状态的状态,并返回新的Provider,否则返回更新的Provider而在其他Provider不依赖于登录状态的情况下,我们必须手动调用函数来清除数据。2/.另一个解决方案是尝试在注销时重新构建mainApp。例如:https://stackoverflow.com/a/68572345/1122308它可能不适用于某些应用程序,因为结构不同。如果您希望它适用于您的应用,请发布您的应用代码。我们可以帮助你3/.通过此软件包注销时重新启动OS级别的应用程序:https://pub.dev/packages/restart_app这是好的,但不是好的UX。iOS不工作https://github.com/gabrimatic/restart_app/issues/1
update
ChangeNotifierProxyProvider
Provider
3条答案
按热度按时间tf7tbtn21#
如果您使用不同的密钥重新构建
MultiProvider
小部件,它会重置状态,因此需要重新构建提供程序。这就是那里解释的。因此,为了实现它,你需要做的是:
假设您使用的是
StatefulWidget
,在本例中。您可以阅读更多关于Flutter here中键的工作原理。zvms9eto2#
其思想是在用户希望注销时清除状态,主要是通过将令牌设置为null
此外,如果您将这些用户数据存储在设备中,则应清除它们。我用sharedprefrences。
我的代码示例
如果您存储了其他数据,也将其设置为null,并确保在将这些数据设置为null后notifyListeners。
我想您已经正确地完成了多提供程序,所以我只让您知道如何完成注销
xdyibdwo3#
问题是当用户A注销,然后用户B登录时,用户A的旧数据仍然在这里。
为了解决这个问题,我有三个解决方案:
1/.在
update
的每个ChangeNotifierProxyProvider
中,必须检查登录状态的状态,并返回新的Provider
,否则返回更新的Provider
而在其他Provider不依赖于登录状态的情况下,我们必须手动调用函数来清除数据。
2/.另一个解决方案是尝试在注销时重新构建mainApp。例如:https://stackoverflow.com/a/68572345/1122308
它可能不适用于某些应用程序,因为结构不同。如果您希望它适用于您的应用,请发布您的应用代码。我们可以帮助你
3/.通过此软件包注销时重新启动OS级别的应用程序:https://pub.dev/packages/restart_app
这是好的,但不是好的UX。iOS不工作https://github.com/gabrimatic/restart_app/issues/1