程序重启后没有进入登录页面,一直在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()是不是已经有值了。

0
2
CrazyCodeBoy
回复
慕村1342571
默认是30天,不过过期时间服务端也在调整。
2021-07-22
共2条回复

慕村1342571

提问者

2021-07-20

修改了下程序启动的登录初始状态直接进入登录页面,老师用苹果编译后会在虚拟机的主页上生成新的app,
如果是windows的android虚拟机如何设置呢?直接划掉程序就从调试模式退出了,要重新启动,
如果这样操作感觉获取的令牌就被清空了,无法复现老师的操作
// RouteStatus _routeStatus = RouteStatus.home;
RouteStatus _routeStatus = RouteStatus.login;


0
0

Flutter高级进阶实战-仿哔哩哔哩-掌握Flutter高阶技能

一次性掌握Flutter高阶技能+商业级复杂项目架构设计与开发方案

1810 学习 · 905 问题

查看课程