Flutter 如何在Flatter中处理不同的登录导航流?
我尝试在注销时设置导航(忘记密码、注册/登录),而不是登录时设置导航(主页、注销、很多东西) 我完全不知道该怎么做。我看到的所有建议都会退出系统的一部分,一个显示登录名的页面,但这在这里不起作用。如果我让导航共享,那么应用程序其余部分的每个页面都需要登录检查,这听起来有点烦人。有没有一种简单的方法来交换导航设置?是否根据用户登录/注销状态动态加载项导航 我可以对导航类本身进行子类化并以这种方式处理它吗Flutter 如何在Flatter中处理不同的登录导航流?,flutter,Flutter,我尝试在注销时设置导航(忘记密码、注册/登录),而不是登录时设置导航(主页、注销、很多东西) 我完全不知道该怎么做。我看到的所有建议都会退出系统的一部分,一个显示登录名的页面,但这在这里不起作用。如果我让导航共享,那么应用程序其余部分的每个页面都需要登录检查,这听起来有点烦人。有没有一种简单的方法来交换导航设置?是否根据用户登录/注销状态动态加载项导航 我可以对导航类本身进行子类化并以这种方式处理它吗 在react native中,您可以通过在登录导航器和注销导航器之间调出正在使用的导航器来完成
在react native中,您可以通过在登录导航器和注销导航器之间调出正在使用的导航器来完成此操作。寻找具有类似结果的东西。React Native允许嵌套导航器,但Flatter不允许。虽然有多种方法可以做到这一点,但毕竟不需要嵌套任何导航器,下面显示了一个简单的示例,说明如何使用颤振进行导航 例如:
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
// Main Application
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Example',
// Routes
routes: <String, WidgetBuilder>{
'/': (_) => new Login(), // Login Page
'/home': (_) => new Home(), // Home Page
'/signUp': (_) => new SignUp(), // The SignUp page
'/forgotPassword': (_) => new ForgotPwd(), // Forgot Password Page
'/screen1':(_) => new Screen1(), // Any View to be navigated from home
},
);
}
}
// The login page
class Login extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text("Login Page"),
// The button on pressed, logs-in the user to and shows Home Page
new FlatButton(
onPressed: () =>
Navigator.of(context).pushReplacementNamed("/home"),
child: new Text("Login")),
// Takes user to sign up page
new FlatButton(
onPressed: () => Navigator.of(context).pushNamed("/signUp"),
child: new Text("SignUp")),
// Takes user to forgot password page
new FlatButton(
onPressed: () =>
Navigator.of(context).pushNamed("/forgotPassword"),
child: new Text("Forgot Password")),
],
),
),
);
}
}
// Home page
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text("Home Page"),
// Logs out user instantly from home
new FlatButton(
onPressed: () => Navigator.of(context).pushReplacementNamed("/"),
child: new Text("Logout")),
// Takes user to Screen1
new FlatButton(
onPressed: () => Navigator.of(context).pushNamed("/screen1"),
child: new Text("Screen 1")),
],
),
),
);
}
}
// Sign Up Page
class SignUp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text("Sign Up Page"),
// To make an api call with SignUp data and take back user to Login Page
new FlatButton(
onPressed: () {
//api call to sign up the user or whatever
Navigator.of(context).pop();
},
child: new Text("SignUp")),
],
),
),
);
}
}
// Forgot Password page
class ForgotPwd extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text("Sign Up"),
// Make api call to resend password and take user back to Login Page
new FlatButton(
onPressed: () {
//api call to reset password or whatever
Navigator.of(context).pop();
},
child: new Text("Resend Passcode")),
],
),
),
);
}
}
// Any Screen
class Screen1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text("Screen 1"),
// Takes the user to the view from which the user had navigated to this view
new FlatButton(
onPressed: () => Navigator.of(context).pop(),
child: new Text("Back")),
// Takes back the user to Home page and Logs out the user
new FlatButton(
onPressed: () async {
Navigator.of(context).popUntil(ModalRoute.withName("/home")); // Use popUntill if you want to reset all routes untill now and completely logout user
Navigator.of(context).pushReplacementNamed("/");
// Just to show login page and resume back after login
// Navigator.of(context).pushNamed('/Login');
// On login page after successful login Navigator.of(context).pop();
// the app will resume with its last route.
},
child: new Text("Logout")),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
//主要应用
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“示例”,
//路线
路线:{
“/”:(\u)=>newlogin(),//登录页面
“/home”:()=>new home(),//主页
“/signUp”:()=>newsignup(),//注册页面
“/forgotPassword”:()=>new ForgotPwd(),//忘记密码页
“/screen1”:(_)=>new screen1(),//要从主页导航的任何视图
},
);
}
}
//登录页面
类登录扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新文本(“登录页”),
//按下上的按钮,用户登录并显示主页
新扁平按钮(
按下:()=>
Navigator.of(context.pushReplacementNamed(“/home”),
子项:新文本(“登录”),
//使用户登录页面
新扁平按钮(
onPressed:()=>Navigator.of(context.pushNamed(“/signUp”),
儿童:新文本(“注册”),
//将用户带到忘记密码页面
新扁平按钮(
按下:()=>
Navigator.of(context.pushNamed(“/forgotPassword”),
子项:新文本(“忘记密码”),
],
),
),
);
}
}
//主页
类Home扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新文本(“主页”),
//用户立即从家中注销
新扁平按钮(
onPressed:()=>Navigator.of(context.pushReplacementNamed(“/”),
子项:新文本(“注销”),
//将用户带到屏幕1
新扁平按钮(
按下:()=>Navigator.of(context.pushNamed(“/screen1”),
子项:新文本(“屏幕1”),
],
),
),
);
}
}
//注册页面
类注册扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新文本(“注册页”),
//使用注册数据进行api调用并将用户带回登录页面
新扁平按钮(
已按下:(){
//api调用来注册用户或其他什么
Navigator.of(context.pop();
},
儿童:新文本(“注册”),
],
),
),
);
}
}
//忘记密码页
类ForgotPwd扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新文本(“注册”),
//进行api调用以重新发送密码,并将用户带回登录页面
新扁平按钮(
已按下:(){
//api调用来重置密码或任何东西
Navigator.of(context.pop();
},
子项:新文本(“重新发送密码”),
],
),
),
);
}
}
//任何屏幕
类Screen1扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
正文:新中心(
子:新列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
新文本(“屏幕1”),
//将用户带到用户从中导航到此视图的视图
新扁平按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:新文本(“返回”),
//将用户带回主页并注销用户
新扁平按钮(
onPressed:()异步{
Navigator.of(context.popintil(ModalRoute.withName(“/home”);//如果要立即重置所有路由并完全注销用户,请使用popintill
Navigator.of(context.pushReplacementNamed(“/”);
//只需显示登录页面并在登录后恢复
//Navigator.of(context.pushNamed('/Login');
//在成功登录Navigator.of(context.pop())后的登录页面上;
//应用程序将继续运行
import 'package:app/pages/home.page.dart';
import 'package:app/pages/login.page.dart';
import 'package:app/services/auth.service.dart';
import 'package:flutter/material.dart';
AuthService appAuth = new AuthService();
void main() async {
// add this, and it should be the first line in main method
WidgetsFlutterBinding.ensureInitialized();
// Set default home.
Widget _defaultHome = new LoginPage();
// Get result of the login function.
bool _result = await appAuth.login();
if (_result) {
_defaultHome = new HomePage();
}
// Run app!
runApp(new MaterialApp(
title: 'App',
home: _defaultHome,
routes: <String, WidgetBuilder>{
// Set routes for using the Navigator.
'/home': (BuildContext context) => new HomePage(),
'/login': (BuildContext context) => new LoginPage()
},
));
}