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
找到问题了, 变量名称问题
012021-12-02
相似问题