比如说,这是AuthenticationService
中的流:
我用bool
进行了简化,通常该值将被一些不可变的值对象包装。
BehaviorSubject<bool> _loggedIn$ = BehaviorSubject<bool>();
BehaviorSubject<bool> get loggedIn$ => _loggedIn$;
我将其映射为
StreamProvider<bool>(
builder: (context) =>
Provider.of<AuthenticationService>(context, listen: false).loggedIn$,
),
我在构建函数中使用它
@override
Widget build(BuildContext context) {
return Provider.of<bool>(context)
? IconButton(
icon: Icon(Icons.home),
onPressed: () => {Navigator.of(context).pushNamed(RoutePath.Home)},
)
: IconButton(
icon: Icon(Icons.add),
onPressed: () => {Navigator.of(context).pushNamed(RoutePath.Login)},
);
}
因此,到目前为止,它可以完美运行。如果我将代码置为每秒钟更改一次流值,则按钮会发生神奇的变化。
我现在尝试实现的一件事是,当值为false
时进行自动路由,但是我尝试在build函数中调用Navigator,但遇到{{1 }}被调用。
侦听流的正确方法是什么,当条件设置为推送另一条路由时,这是什么? 还要清理流,以便不留下任何拖拽的侦听器?
答案 0 :(得分:1)
针对您的特定用例的简单解决方案是安排下一帧的导航,这样就不会同步调用它,因此不再抛出该异常:
WidgetsBinding.instance.addPostFrameCallback((_) {
... invoke Navigator here
}
答案 1 :(得分:-1)
在值更改为true / false时将其设置为状态变量,状态值的更改将导致窗口小部件重新呈现,并根据状态值导航到新路线。