登录成功,杀掉应用。在打开应用,不进首页。

来源: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的时候有没有取到上次保存的登陆信息。

0
3
CrazyCodeBoy
回复
houlonglong
好的。
2021-07-06
共3条回复

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

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

1812 学习 · 906 问题

查看课程