返回到 flutter 中查看

发布于 2025-01-17 03:32:18 字数 465 浏览 1 评论 0原文

我在颤振中的导航器有一个小问题。我有 3 个窗口:(登录 -> 主页 -> 订单)。但是,当我从“登录”转到“主页”时,一切正常,但如果我从“主页”转到“订单”并使用 android 后退按钮,它会将我返回到“登录”窗口,即直到第一个视图,而不是第二个视图。

登录的我的代码导航:

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => HomeScreen(),
  ),
);

HomeScreen 的我的代码导航

Navigator.push(this.context,
  MaterialPageRoute(
    builder: (context) =\> Orders(
      numTable: numTable,
    ),
  )
);

i have a little problem with the Navigator in flutter. I have 3 windows: (Login -> Home -> Orders). But when I go from Login to Home, everything works fine, but if I go from Home to Orders and use the android back button, it returns me to the Login window, that is, until the first view, not the second.

My code Navigation of Login:

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => HomeScreen(),
  ),
);

My Code Navigation of HomeScreen

Navigator.push(this.context,
  MaterialPageRoute(
    builder: (context) =\> Orders(
      numTable: numTable,
    ),
  )
);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

萌能量女王 2025-01-24 03:32:18

解决方案:在登录页面使用pushAndRemoveUntil或pushReplacement

  class LoginPage extends StatelessWidget {
  const LoginPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
  return Scaffold(
    body: InkWell(
        onTap: ()=>Navigator.of(context).pushAndRemoveUntil(
          MaterialPageRoute(
            builder: (context) => HomePage(),
          )
        ,(Route<dynamic> route) => false), child: Center(child: Text("LoginPage"),)),

    );

}
}
  ------------
class HomePage extends StatelessWidget {
 const HomePage({Key? key}) : super(key: key);

 @override
 Widget build(BuildContext context) {
   return Scaffold(
   body: InkWell(
      onTap: ()=>Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => OrdersPage(),
          ))
          , child: Center(child: Text("HomePage"),)),

  );
 }
}
---------------
class OrdersPage extends StatelessWidget {
  const OrdersPage({Key? key}) : super(key: key);

  @override
   Widget build(BuildContext context) {
    return Scaffold(
  body: Center(child: Text("OrdersPage"),),
);
}
  }

Solution : use pushAndRemoveUntil or pushReplacement at the LoginPage

  class LoginPage extends StatelessWidget {
  const LoginPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
  return Scaffold(
    body: InkWell(
        onTap: ()=>Navigator.of(context).pushAndRemoveUntil(
          MaterialPageRoute(
            builder: (context) => HomePage(),
          )
        ,(Route<dynamic> route) => false), child: Center(child: Text("LoginPage"),)),

    );

}
}
  ------------
class HomePage extends StatelessWidget {
 const HomePage({Key? key}) : super(key: key);

 @override
 Widget build(BuildContext context) {
   return Scaffold(
   body: InkWell(
      onTap: ()=>Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => OrdersPage(),
          ))
          , child: Center(child: Text("HomePage"),)),

  );
 }
}
---------------
class OrdersPage extends StatelessWidget {
  const OrdersPage({Key? key}) : super(key: key);

  @override
   Widget build(BuildContext context) {
    return Scaffold(
  body: Center(child: Text("OrdersPage"),),
);
}
  }
超可爱的懒熊 2025-01-24 03:32:18

中使用Login pushReplacement

Navigator.of(context).pushReplacement(
  MaterialPageRoute(
    builder: (context) => HomeScreen(),
  ),
);

如果用户登录成功,在HomeScreen

Navigator.push(this.context,
  MaterialPageRoute(
    builder: (context) =\> Orders(
      numTable: numTable,
    ),
  )
);

当点击android后退按钮时,将转到窗口HomeScreen

if users login successfully use in Login pushReplacement

Navigator.of(context).pushReplacement(
  MaterialPageRoute(
    builder: (context) => HomeScreen(),
  ),
);

in HomeScreen

Navigator.push(this.context,
  MaterialPageRoute(
    builder: (context) =\> Orders(
      numTable: numTable,
    ),
  )
);

when click android back button will go window HomeScreen

蓝颜夕 2025-01-24 03:32:18

您可以按照这种方法执行您想要的操作,只需在每个页面上执行 Navigator.of(context).push(route) 即可:

class Login extends StatefulWidget {
  const Login({Key? key}) : super(key: key);

  @override
  State<Login> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Login'),
      ),
      body: Center(
        child: Column(
          children: [
            TextButton(
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => const Home(),
                  ),
                );
              },
              child: const Text('HOME'),
            ),
          ],
        ),
      ),
    );
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
      ),
      body: Column(
        children: [

          TextButton(onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => const Orders(),
              ),
            );
          }, child: const Text('Orders'))

        ],
      ),
    );
  }
}

class Orders extends StatefulWidget {
  const Orders({Key? key}) : super(key: key);

  @override
  State<Orders> createState() => _OrdersState();
}

class _OrdersState extends State<Orders> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Orders'),
      ),
      body: Column(
        children: [
          TextButton(onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => const Home(),
              ),
            );
          }, child: const Text('Home'))

        ],
      ),
    );
  }
}

You can follow this approach which does what you want, just do Navigator.of(context).push(route) on each page:

class Login extends StatefulWidget {
  const Login({Key? key}) : super(key: key);

  @override
  State<Login> createState() => _LoginState();
}

class _LoginState extends State<Login> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Login'),
      ),
      body: Center(
        child: Column(
          children: [
            TextButton(
              onPressed: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => const Home(),
                  ),
                );
              },
              child: const Text('HOME'),
            ),
          ],
        ),
      ),
    );
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Home'),
      ),
      body: Column(
        children: [

          TextButton(onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => const Orders(),
              ),
            );
          }, child: const Text('Orders'))

        ],
      ),
    );
  }
}

class Orders extends StatefulWidget {
  const Orders({Key? key}) : super(key: key);

  @override
  State<Orders> createState() => _OrdersState();
}

class _OrdersState extends State<Orders> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Orders'),
      ),
      body: Column(
        children: [
          TextButton(onPressed: () {
            Navigator.of(context).push(
              MaterialPageRoute(
                builder: (context) => const Home(),
              ),
            );
          }, child: const Text('Home'))

        ],
      ),
    );
  }
}
江湖彼岸 2025-01-24 03:32:18

尽管使用 Material 包中的 Navigator 可以回答您的问题,但我想为您提供一个在 Flutter 中更简单导航的提示:使用 获取包。

使用 Get,此代码:

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => HomeScreen(),
  ),
);

可以替换为此代码:

Get.to(() => HomeScreen());

在您的示例中,当用户经过身份验证时,您将使用以下代码从登录转到主页:

Get.offAll(() => HomeScreen());

之后,您可以像这样从一个屏幕移动到另一个屏幕:

Get.off(() => [targetscreen]());
Get.to(() => [targetscreen]());

Although there are answers to your question using the Navigator from the Material package, I would like to provide you with a tip for much simpler navigation in Flutter: Use the Get package.

With Get, this code:

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => HomeScreen(),
  ),
);

can be replaced with this code:

Get.to(() => HomeScreen());

In your example, you will then use the following code to go from Login to Home when a user has been authenticated:

Get.offAll(() => HomeScreen());

After that, you can move from screen to screen like this:

Get.off(() => [targetscreen]());
Get.to(() => [targetscreen]());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文