如何根据Flutter中的StreamProvider更改调用Navigator.pushNamed

时间:2019-08-05 18:51:35

标签: flutter dart

比如说,这是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 }}被调用。

侦听流的正确方法是什么,当条件设置为推送另一条路由时,这是什么? 还要清理流,以便不留下任何拖拽的侦听器?

2 个答案:

答案 0 :(得分:1)

针对您的特定用例的简单解决方案是安排下一帧的导航,这样就不会同步调用它,因此不再抛出该异常:

WidgetsBinding.instance.addPostFrameCallback((_) {
  ... invoke Navigator here
}

答案 1 :(得分:-1)

在值更改为true / false时将其设置为状态变量,状态值的更改将导致窗口小部件重新呈现,并根据状态值导航到新路线。