dart 空安全

来源:5-4 Flutter新版路由和导航系统实战(一)

慕粉1044104991

2021-12-01

图片描述

import 'package:flutter/material.dart';
import 'package:geiligeili/page/home_page.dart';
import 'package:geiligeili/page/login_page.dart';
import 'package:geiligeili/page/registion_page.dart';
import 'package:geiligeili/page/video_detail.dart';

import 'http/core/hi_error.dart';
import 'http/core/hi_net.dart';
import 'http/dao/login_dao.dart';
import 'http/request/notice_request.dart';
import 'model/video_model.dart';

void main() {
  runApp(BiliApp());
}

class BiliApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _BiliAppState();
}

class _BiliAppState extends State<BiliApp> {
  final BiliRouterDelegate _routerDelegate = BiliRouterDelegate();
  final BiliRouteInformationParser _routeInformationParser =
      BiliRouteInformationParser();

  @override
  Widget build(BuildContext context) {
    print('_BiliAppState:build');
    //定义route
    var widget = Router(
      routeInformationParser: _routeInformationParser,
      routerDelegate: _routerDelegate,

      ///routeInformationParser为null时可缺省,routeInformation提供者
      routeInformationProvider: PlatformRouteInformationProvider(
          initialRouteInformation: RouteInformation(location: '/')),
    );
    return MaterialApp(home: widget);
  }
}

class BiliRouterDelegate extends RouterDelegate<BiliRoutePath>
    with ChangeNotifier, PopNavigatorRouterDelegateMixin<BiliRoutePath> {
  final GlobalKey<NavigatorState> navigatorKey;
  BiliRoutePath? path;
  List<MaterialPage> pages = [];
  VideoModel? videoModel;

  //为Navigator设置一个key,必要的时候可以通过navigatorKey.currentState来获取到NavigatorState对象
  BiliRouterDelegat() : navigatorKey = GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    //构建路由栈
    pages = [
      pageWrap(HomePage()),
      if (videoModel != null)
        pageWrap(
          VideoDetailPage(
            videoModel: videoModel,
          ),
        )
    ];
    return Navigator(
      key: navigatorKey,
      pages: pages,
      onPopPage: (route, result) {
        print('Navigator:onPopPage');
        //在这里可以控制是否可以返回
        if (!route.didPop(result)) {
          return false;
        }
        return true;
      },
    );
  }

  //路由初始化时,Router 会调用setNewRoutePath 方法来更新应用程序的路由状态:
  @override
  Future<void> setNewRoutePath(BiliRoutePath path) async {
    print('BiliRouterDelegate:setNewRoutePath:$path');
    this.path = path;
  }
}

///可缺省,主要应用与web,持有RouteInformationProvider 提供的 RouteInformation ,可以将其解析为我们定义的数据类型。
class BiliRouteInformationParser extends RouteInformationParser<BiliRoutePath> {
  @override
  Future<BiliRoutePath> parseRouteInformation(
      RouteInformation routeInformation) async {
    final uri = Uri.parse(routeInformation.location!);
    print('BiliRouteInformationParser:parseRouteInformation:uri:$uri');
    if (uri.pathSegments.length == 0) {
      return BiliRoutePath.home();
    }
    return BiliRoutePath.detail();
  }
}

///定义路由path
class BiliRoutePath {
  final String location;

  BiliRoutePath.home() : location = "/";

  BiliRoutePath.detail() : location = "/detail";
}

///创建Page
pageWrap(Widget child) {
  return MaterialPage(
    key: ValueKey(child.hashCode),
    child: child,
  );
}

老师,请教一下这里应该怎么修改呢

写回答

1回答

慕粉1044104991

提问者

2021-12-01

找到问题了, 变量名称问题 

0
1
CrazyCodeBoy
好的,也可参考下这块课程源码空安全的实现哦
2021-12-02
共1条回复

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

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

1723 学习 · 870 问题

查看课程