首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于导航流的颤振区块

用于导航流的颤振区块
EN

Stack Overflow用户
提问于 2018-10-17 23:23:12
回答 1查看 4.6K关注 0票数 11

我正在开始使用BLoC模式,但我有一个问题:

1)您是否应该使用BloC模式来确定路由是否应该更改?示例:身份验证对象更改为unauthenticated,因此侦听器应处理路由更改。

2) BLoC模式是否应该仅用于UI状态,并在UI更改时处理路由更改?示例:用户单击login并导航到home屏幕。

我问这个问题是因为我面临着一个问题,我没有一个中央导航管理解决方案。

这段代码现在在我的BLoC中:

代码语言:javascript
复制
loggedIn.listen((AuthResponse user) {
      currentUserSubject.add(user);
      Navigator.pushReplacement(
        _context,
        PageRouteBuilder(
          pageBuilder: (context, animation1, animation2) {
            return HomePage();
          },
          transitionsBuilder: (context, animation, _, child) {
            return new SlideTransition(
              child: child,
              position: new Tween<Offset>(
                begin: const Offset(0.0, 1.0),
                end: Offset.zero,
              ).animate(animation),
            );
          },
          transitionDuration: Duration(milliseconds: 400),
        ),
      );
    }, onError: (error) {
      Scaffold.of(_context).showSnackBar(new SnackBar(
        content: new Text(error.message),
      ));
    });
EN

回答 1

Stack Overflow用户

发布于 2019-05-31 10:01:27

我目前正在做的是:

  1. 注册一个NavigatorBloc,它在构造函数中接收NavigatorState并接收导航到应用程序中不同页面的操作例如:GoToHomePageActionGoToRegisterPageActionNavigatorActionPop.

在您的App小部件中,注册NavigatorBloc并提供附加到MaterialApp小部件的导航键。

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
    return BlocProvider<NavigatorBloc>(
      bloc: NavigatorBloc(navigatorKey: widget.navigatorKey),
      child: MaterialApp(
        navigatorKey: widget.navigatorKey,
        title: 'Medicine Tracker',
        theme: ThemeData(
            primarySwatch: Colors.red,
            scaffoldBackgroundColor: Colors.white
        ),
        home: HomePage(),
      ),
    );
  }

然后在你的NavigatorBloc旁边,你只需检查操作并导航到所需的页面:

代码语言:javascript
复制
class NavigatorBloc extends Bloc<NavigatorAction, dynamic>{
  final GlobalKey<NavigatorState> navigatorKey;
  NavigatorBloc({this.navigatorKey});

  @override
  dynamic get initialState => 0;

  @override
  Stream<dynamic> mapEventToState(NavigatorAction event) async* {
    if(event is NavigatorActionPop){
      yield navigatorKey.currentState.pop();
    }
  }
}

希望能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52858417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档