Flutter -如何在用户从应用程序注销后擦除提供商数据?

zujrkrfu  于 2023-05-23  发布在  Flutter
关注(0)|答案(3)|浏览(164)

我在flutter应用程序中使用provider进行状态管理。我使用Multiprovider实现了提供程序。
当用户从应用程序注销时,我想擦除提供商数据,我已经读出了this评论,但不太理解。

tf7tbtn2

tf7tbtn21#

如果您使用不同的密钥重新构建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中键的工作原理。

zvms9eto

zvms9eto2#

其思想是在用户希望注销时清除状态,主要是通过将令牌设置为null
此外,如果您将这些用户数据存储在设备中,则应清除它们。我用sharedprefrences。
我的代码示例

Future<void> logOut() async {
    _token = null;
    notifyListeners();
    final prefs = await SharedPreferences.getInstance();
    prefs.clear();
  }

如果您存储了其他数据,也将其设置为null,并确保在将这些数据设置为null后notifyListeners。
我想您已经正确地完成了多提供程序,所以我只让您知道如何完成注销

xdyibdwo

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

相关问题