回到 flutter 中查看

Back to view in flutter

我对 Flutter 中的 Navigator 有一些小问题。我有 3 windows:(登录 -> 主页 -> 订单)。但是当我从 Login 转到 Home 时,一切正常,但是如果我从 Home 转到 Orders 并使用 android 后退按钮,它 returns 我到 Login window,即, 直到第一个视图,而不是第二个视图。

我的登录代码导航:

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

我的主屏幕代码导航

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

如果用户登录成功,请使用 Login pushReplacement

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

主屏幕

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

当单击 android 后退按钮时 将转到 window HomeScreen

你可以按照这个方法做你想做的,只需在每个页面上做 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'))

        ],
      ),
    );
  }
}

解决方案:在登录页面使用 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"),),
);
}
  }

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

使用 Get,此代码:

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

可以用这个代码代替:

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

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

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

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

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