Flutter Widgets 绑定观察者
Posted
技术标签:
【中文标题】Flutter Widgets 绑定观察者【英文标题】:Flutter Widgets Binding Observer 【发布时间】:2020-05-22 15:27:42 【问题描述】:在 Flutter 中,我想回到我离开应用程序的页面。但是当我尝试返回时,它总是导航到 LoginPage。例如,我有 3 个页面。登录页面、锻炼页面、进度页面。登录页面是我的启动器。当我在 ProgressPage 上时,我会离开应用程序。但是当我恢复时,它会导航登录页面。我在登录页面中使用了此代码。
登录页面
class ProgressTabState extends State with WidgetsBindingObserver
AppLifecycleState state;
@override
void initState()
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addObserver(this);
@override
void dispose()
// TODO: implement dispose
super.dispose();
WidgetsBinding.instance.removeObserver(this);
@override
void didChangeAppLifecycleState(AppLifecycleState appLifecycleState)
// TODO: implement didChangeAppLifecycleState
super.didChangeAppLifecycleState(state);
state = appLifecycleState;
在登录页面中,我使用此代码导航到 MainTab。
Navigator.push(
context,
MaterialPageRoute(
builder: (_)
return MainTabs();
,
),
);
在主要选项卡中,我有两页的 Tabbarviews。锻炼页面和进度页面。这是锻炼页面。
class WorkoutTabState extends State <WorkoutTab>
@override
void initState()
// TODO: implement initState
super.initState();
@override
void dispose()
// TODO: implement dispose
super.dispose();
@override
Widget build(BuildContext context)
// TODO: implement build
return Scaffold(
body:Text("Workout Page"),
);
进度页面
class ProgressTabState extends State with WidgetsBindingObserver
AppLifecycleState state;
@override
void initState()
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addObserver(this);
@override
void dispose()
// TODO: implement dispose
super.dispose();
WidgetsBinding.instance.removeObserver(this);
@override
void didChangeAppLifecycleState(AppLifecycleState appLifecycleState)
// TODO: implement didChangeAppLifecycleState
super.didChangeAppLifecycleState(state);
state = appLifecycleState;
@override
Widget build(BuildContext context)
return Scaffold(
body:Text("Progress Page"));
【问题讨论】:
请发布您的源代码或minimal reproducible example 以帮助诊断问题。 请同时显示导航代码。 你不需要所有这些观察者。您只需将您的状态(表示某人已登录)存储在某处(例如 shared_preferences),然后在您的应用启动时将正确的initialRoute
添加到MaterialApp
。
【参考方案1】:
在登录页面不要使用 Navigator.push 而是使用 Navigator.of(context).pushNamedAndRemoveUntil
不同之处在于 Navigator.push 会将登录页面作为第一页,因此它总是会退回到登录页面,成功登录后您不希望这样,您需要使用 Navigator 从路由堆栈中删除登录页面.of(context).pushNamedAndRemoveUntil,现在在 main 和 progress 之间导航时使用 Navigator.push 这将使主页成为fallbck的第一条路线 请阅读有关它的信息 https://api.flutter.dev/flutter/widgets/NavigatorState/pushAndRemoveUntil.html
【讨论】:
这对我的登录页面有帮助。当我按下主页按钮并且程序进入后台不退出时如何返回相同的页面? 如果我明白你想要什么,你在 MainPage 你去(使用推送)到 Page1 然后从 Page1 你想回到 MainPage 使用 Navigator.pop(context);在 Page1 中,这将弹出 Page1 并将您送回 MainPage以上是关于Flutter Widgets 绑定观察者的主要内容,如果未能解决你的问题,请参考以下文章
为啥尽管观察者的状态发生变化,但应用程序重启后 Flutter BloC UI 没有更新?