gpt4 book ai didi

调用 pushReplacement 后 Flutter StreamProvider 未更新

转载 作者:行者123 更新时间:2023-12-02 16:35:44 24 4
gpt4 key购买 nike

我有一个实现 firebase 身份验证的 flutter 应用程序。关注this后教程我的 main.dart 文件如下所示:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
catchError: (_, err) => null,
value: AuthService().user,
child: MaterialApp(
home: Wrapper(),
),
);
}
}

值:AuthService().user 由以下get 函数 作为流返回:

// auth change user stream
Stream<User> get user {
return _auth.onAuthStateChanged.map(
(FirebaseUser user) => _userFromFirebaseUser(user),
);
}

User _userFromFirebaseUser(FirebaseUser user) {

return user != null ? User(uid: user.uid) : null;
}

Wrapper() 小部件如下所示:

class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);

if (user == null) {
print("user is null, should show Authenticate()");
return Authenticate();
} else {
return Home();
}
}
}

此代码在以下情况下起作用:

  1. 从 Authenticate() 小部件登录
  2. 从 Home() 屏幕注销。

但是,从 Home() 屏幕导航是这样布局的:

  • 主页()
    • 第二页()
      • 第三页()

我在前进时使用 Navigator.push()(即从“SecondPage()”到“ThirdPage()”)。然后,我将第二页和第三页脚手架包装在 WillPopScope 中,其中 onWillPop 调用 Navigator.pushReplacement() 向后导航。

(注意:我这样做是因为这些页面从 firebase firestore 读取和写入数据,并且 Navigator.pop() 不会导致重新渲染。这意味着用户可能会更新某些内容ThirdPage() 更改了 firestore 中的值,但是当我随后调用 Navigator.pop() 时,它不会使用新数据更新 SecondPage()。)

我的问题是,当从 SecondPage() 导航到 Home() 页面时,有关 Navigator.pushReplacement() 的问题导致了问题,因此当用户随后注销时,屏幕不显示 Authenticate()页面。

我在 Wrapper() 中放置了一个 print("user is null, should show Authenticate()") 调用来验证 if (user == null) 在用户单击注销按钮时为 true。它确实打印了,但它仍然没有显示 Authenticate() 屏幕。

我知道它与 pushReplacement() 有关,因为直接从 Home() 注销而没有导航到任何地方功能正常(即显示 Authenticate() 页面)。感谢您的帮助。

最佳答案

我在学习相同的教程时遇到了同样的问题。就我而言,事实证明 signUp 按钮工作正常,但对于注销和登录,我需要刷新才能看到更改。在调试文件后,我得出了这个结论。

尽管流总是监听传入的数据,但它位于 Widget 构建方法内部,需要调用以获取另一个流。所以我只需要调用Wrapper() 方法,一旦我检测到非空用户值。所以我这样做了。

Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (context)=>
Wrapper()), (_) => false );

我在 signIn 页面中做了一个 if-else 语句,当用户返回非 null 时我调用了一次 Wrapper()再次成功。

关于调用 pushReplacement 后 Flutter StreamProvider 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62756173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com