dart - 用于导航流的 Flutter Bloc
问题描述
我开始使用 BLoC 模式,但我有一个问题:
1)您是否应该使用 BloC 模式来确定路线是否应该改变?示例:身份验证对象更改为,unauthenticated
因此侦听器应处理路由更改。
2) BLoC 模式是否应该仅用于 UI 状态并处理 UI 更改时的路由更改?示例:用户单击login
并导航到home
屏幕。
我问这个问题是因为我面临一个没有中央导航管理解决方案的问题。
这段代码现在在我的 BLoC 中:
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),
));
});
解决方案
我目前正在做的是:
- 在构造函数中注册一个
NavigatorBloc
接收 aNavigatorState
并接收操作以导航到您的应用程序中的不同页面 Ex:GoToHomePageAction
,GoToRegisterPageAction
,NavigatorActionPop
.
在您的 App 小部件中,您注册NavigatorBloc
并提供附加到MaterialApp
小部件的导航键。
@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
只需检查操作并导航到所需的页面:
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();
}
}
}
希望它有所帮助。
推荐阅读
- c# - 如何在 C# 中的 PictureBox 上显示 PictureBox?
- python-3.x - 程序询问姓名并搜索与该姓名关联的号码
- variables - 将 awk 的输出分配给变量
- integration-testing - 如何在 web api 核心中禁用启动类的 swagger 功能以进行集成测试
- php - 在 laravel 中通过 id 显示项目详细信息的函数创建
- r - 如何重新排列矩阵?
- amazon-ec2 - 设置端口 80/443 后无法 ping aws ec2 服务器或启动网页
- tensorflow - 无法在 Ubuntu 18.04 + Python 3.7.5 上安装 Rasa?
- java - 在 HTTP 请求中设置 UTC 时间
- python - 在启动线程之前选择要在线程内执行的方法