我對導航器的顫動有一點問題。我有 3 個視窗:(登錄 -> 主頁 -> 訂單)。但是當我從登錄轉到主頁時,一切正常,但是如果我從主頁轉到訂單并使用 android 后退按鈕,它會將我回傳到登錄視窗,也就是說,直到第一個視圖,而不是第二個視圖。
我的登錄代碼導航:
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => HomeScreen(),
),
);
我的 HomeScreen 代碼導航
Navigator.push(this.context,
MaterialPageRoute(
builder: (context) =\> Orders(
numTable: numTable,
),
)
);
uj5u.com熱心網友回復:
解決方案:在 LoginPage 處使用 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"),),
);
}
}
uj5u.com熱心網友回復:
如果用戶登錄成功,在Login pushReplacement中使用
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => HomeScreen(),
),
);
在主螢屏中
Navigator.push(this.context,
MaterialPageRoute(
builder: (context) =\> Orders(
numTable: numTable,
),
)
);
當點擊android 后退按鈕將轉到視窗HomeScreen
uj5u.com熱心網友回復:
您可以按照這種方法做您想做的事,只需在每個頁面上執行 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'))
],
),
);
}
}
uj5u.com熱心網友回復:
盡管使用 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]());
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449858.html
上一篇:如何在字串串列中回傳未來串列?
