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 没有更新?

如何在firebase Flutter中将2个用户链接在一起

Angularjs:为啥 1 个绑定有 3 个观察者?

js设计模式-观察者模式来模拟vue的双向数据绑定

如何将多个观察者绑定到一个 ControlProperty

观察者模式--双向数据绑定