登录成功,杀掉应用。在打开应用,不进首页。
来源:5-7 基于全新Navigator封装易用的导航框架(二)
houlonglong
2021-07-04
我的已经的登录成功。杀掉app,又要重新登录。我看你的视频,杀掉app,在登录进去就要首页了`
// main.dart
class BiliRouteDelegate extends RouterDelegate<BiliRoutePath>
with ChangeNotifier, PopNavigatorRouterDelegateMixin<BiliRoutePath> {
final GlobalKey<NavigatorState> navigatorKey;
BiliRouteDelegate() : navigatorKey = GlobalKey<NavigatorState>();
List<MaterialPage> pages = [];
RouteStatus _routeStatus = RouteStatus.home;
VideoModel videoModel;
@override
Widget build(BuildContext context) {
//要打开的页面在栈中已存在,则将该页面和它上面的所有页面进行出栈
//tips 具体规则可以根据需要进行调整,这里要求栈中只允许有一个同样的页面的实例
var index = getPageIndex(pages, routeStatus);
List<MaterialPage> tempPages = pages;
if (index != -1) {
tempPages = tempPages.sublist(0, index);
}
var page;
if (routeStatus == RouteStatus.home) {
//跳转首页时将栈中其它页面进行出栈,因为首页不可回退
pages.clear();
page = pageWrap(HomePage());
} else if (routeStatus == RouteStatus.detail) {
page = pageWrap(VideoDetailPage(videoModel));
} else if (routeStatus == RouteStatus.registration) {
page = pageWrap(RegistrationPage());
} else if (routeStatus == RouteStatus.login) {
page = pageWrap(LoginPage());
}
tempPages = [...tempPages, page];
pages = tempPages;
//构建路由栈
// pages = [if (videoModel != null) pageWrap(VideoDetailPage(videoModel))];
return Navigator(
key: navigatorKey,
pages: pages,
onPopPage: (route, result) {
if (route.didPop(result)) {
return false;
} else {
return true;
}
},
);
}
// 重新创建一个数组,否则pages因引用没有改变路由不会生效
RouteStatus get routeStatus {
if (_routeStatus != RouteStatus.registration && !hasLogin) {
return _routeStatus = RouteStatus.login;
} else if (videoModel != null) {
return _routeStatus = RouteStatus.detail;
} else {
return _routeStatus;
}
}
bool get hasLogin => LoginDao.getBoardingPass() != null;
@override
Future<void> setNewRoutePath(BiliRoutePath path) async {}
}
class BiliRoutePath {
final String location;
BiliRoutePath.home() : location = '/';
BiliRoutePath.detail() : location = '/detail';
}
//hi_navigator.dart
import 'package:flutter/material.dart';
import 'package:flutter_bibi/page/home_page.dart';
import 'package:flutter_bibi/page/login_page.dart';
import 'package:flutter_bibi/page/registration_page.dart';
import 'package:flutter_bibi/page/video_detail_page.dart';
//创建页面
pageWrap(Widget child) {
return MaterialPage(key: ValueKey(child.hashCode), child: child);
}
int getPageIndex(List<MaterialPage> pages, RouteStatus routeStatus) {
for (int i = 0; i < pages.length; i++) {
MaterialPage page = pages[i];
if (getStatus(page) == routeStatus) {
return i;
}
}
return -1;
}
//自定义路由封装, 路由状态
enum RouteStatus { login, registration, home, detail, unknow }
//获取page对应的RouteStatus
RouteStatus getStatus(MaterialPage page) {
if (page.child is LoginPage) {
return RouteStatus.login;
} else if (page.child is RegistrationPage) {
return RouteStatus.registration;
} else if (page.child is HomePage) {
return RouteStatus.home;
} else if (page.child is VideoDetailPage) {
return RouteStatus.detail;
} else {
return RouteStatus.unknow;
}
}
////路由信息
class RouteStatusInfo {
final RouteStatus routeStatus;
final Widget page;
RouteStatusInfo(this.routeStatus, this.page);
}
写回答
1回答
-
CrazyCodeBoy
2021-07-05
debug打个断点看下在第二次进入APP的时候有没有取到上次保存的登陆信息。
032021-07-06
相似问题