程序重启后没有进入登录页面,一直在home页面
来源:5-7 基于全新Navigator封装易用的导航框架(二)
慕村1342571
2021-07-20
import ‘package:flutter/material.dart’;
import ‘package:flutter_mvp_app/db/HiCache.dart’;
import ‘package:flutter_mvp_app/http/dao/login_dao.dart’;
import ‘package:flutter_mvp_app/model/video_model.dart’;
import ‘package:flutter_mvp_app/navigator/hi_navigator.dart’;
import ‘package:flutter_mvp_app/page/home_page.dart’;
import ‘package:flutter_mvp_app/page/login_page.dart’;
import ‘package:flutter_mvp_app/page/registration_page.dart’;
import ‘package:flutter_mvp_app/page/video_detail_page.dart’;
import ‘package:flutter_mvp_app/util/color.dart’;
void main() {
runApp(BiliApp());
}
class BiliApp extends StatefulWidget {
@override
_BiliAppState createState() => _BiliAppState();
}
class _BiliAppState extends State {
BiliRouteDelegate _routeDelegate = BiliRouteDelegate();
@override
Widget build(BuildContext context) {
return FutureBuilder(
// 进行初始化
future: HiCache.preInit(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
// 定义route
var widget = snapshot.connectionState == ConnectionState.done
? Router(
routerDelegate: _routeDelegate,
)
: Scaffold(
body: Center(child: CircularProgressIndicator()),
);
return MaterialApp(
home: widget,
theme: ThemeData(primarySwatch: white),
);
});
}
}
class BiliRouteDelegate extends RouterDelegate
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
final GlobalKey navigatorKey;
// 为Navigator设置一个key, 必要的时候可以通过navigatorKey.currentState来获取到NavigatorState对象
BiliRouteDelegate() : navigatorKey = GlobalKey();
RouteStatus _routeStatus = RouteStatus.home;
List pages = [];
VideoModel videoModel;
@override
Widget build(BuildContext context) {
var index = getPageIndex(pages, routeStatus);
List tempPages = pages;
if (index != -1) {
// 要打开的页面在栈中已存在,将该页面和它上面的所有页面进行出栈
// Tips具体规则可以根据需要进行调整,这里要求栈中只允许有一个同样的页面的实例
tempPages = tempPages.sublist(0, index);
}
var page;
if (routeStatus == RouteStatus.home) {
// 跳转首页时将栈中其他页面进行出栈,因为首页不可回退
pages.clear();
page = pageWrap(HomePage(
onJumpToDetail: (videoModel) {
this.videoModel = videoModel;
notifyListeners();
},
));
} else if (routeStatus == RouteStatus.detail) {
page = pageWrap(VideoDetailPage(videoModel));
} else if (routeStatus == RouteStatus.registration) {
page = pageWrap(RegistrationPage(onJumpToLogin: () {
_routeStatus = RouteStatus.login;
notifyListeners();
}));
} else if (routeStatus == RouteStatus.login) {
page = pageWrap(LoginPage());
}
// 重新创建一个数组,否则pages因引用没有改变路由不会生效
tempPages = […tempPages, page];
pages = tempPages;
return Navigator(
key: navigatorKey,
pages: pages,
onPopPage: (route, result) {
// 在这里可以控制是否可以返回
if (!route.didPop(result)) {
return false;
}
return true;
},
);
}
// 获取路由状态
// 若未登录,则转登录页面;若有视频窗口,则转视频详情页;否则返回当前路由
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 setNewRoutePath(BiliRoutePath configuration) async {
// this.path = path;
}
}
// 定义路由数据,path
class BiliRoutePath {
final String location;
BiliRoutePath.home() : location = “/”;
BiliRoutePath.detail() : location = “/detail”;
}
// 创建页面
pageWrap(Widget child) {
return MaterialPage(key: ValueKey(child.hashCode), child: child);
}
2回答
-
CrazyCodeBoy
2021-07-21
debug看下LoginDao.getBoardingPass()是不是已经有值了。
022021-07-22 -
慕村1342571
提问者
2021-07-20
修改了下程序启动的登录初始状态直接进入登录页面,老师用苹果编译后会在虚拟机的主页上生成新的app, 如果是windows的android虚拟机如何设置呢?直接划掉程序就从调试模式退出了,要重新启动, 如果这样操作感觉获取的令牌就被清空了,无法复现老师的操作 // RouteStatus _routeStatus = RouteStatus.home; RouteStatus _routeStatus = RouteStatus.login;
00
相似问题