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

18010921叶明
2022-01-23
这是提问者的源码
import ‘dart:convert’;
import ‘package:flutter/material.dart’;
import ‘package:flutter_app/db/hi_cache.dart’;
import ‘package:flutter_app/http/core/hi_error.dart’;
import ‘package:flutter_app/http/core/hi_net.dart’;
import ‘package:flutter_app/http/dao/login_dao.dart’;
import ‘package:flutter_app/http/request/notice_request.dart’;
import ‘package:flutter_app/http/request/test_request.dart’;
import ‘package:flutter_app/model/owner.dart’;
import ‘package:flutter_app/model/video_model.dart’;
import ‘package:flutter_app/page/home_page.dart’;
import ‘package:flutter_app/page/login_page.dart’;
import ‘package:flutter_app/page/regisitration_page.dart’;
import ‘package:flutter_app/page/video_detail_page.dart’;
import ‘package:flutter_app/util/color.dart’;
void main() {
runApp(BiliApp());
}
/class MyApp
class MyHomePage
class _MyHomePageState/ //这三个类是创捷项目初始创建的 ,详细的学习内容,已经转移到test_set_pre
class BiliApp extends StatefulWidget {
const BiliApp({Key? key}) : super(key: key);
@override
_BiliAppState createState() => _BiliAppState();
}
class _BiliAppState extends State {
@override
BiliRouteDelegate _routeDelegate=BiliRouteDelegate();
BiliRouteInformationParser _biliRouteInformationParser=BiliRouteInformationParser();
Widget build(BuildContext context) {
var widget = Router(
routerDelegate: _routeDelegate,
routeInformationParser: _biliRouteInformationParser,
routeInformationProvider: PlatformRouteInformationProvider(//provider是配合Parser使用,Paser有则provider有
initialRouteInformation: RouteInformation(location: “/”)
),);
return MaterialApp(
//定义route
home: widget,
);
}
}
class BiliRouteDelegate extends RouterDelegate
with ChangeNotifier,PopNavigatorRouterDelegateMixin{
final GlobalKey navigatorKey;//TODO 4-3 16:00
//为Navigator设置一个key,必要的时候可以通过navigatorKey.currentState来获取到NavigatorState的对象
List pages=[];
VideoModel? videoModel;
BiliRoutePath? path;
BiliRouteDelegate(): navigatorKey=GlobalKey();//TODO 初始化navigationKey
@override
Widget build(BuildContext context) {
//构建路由栈
pages=[
pageWrap(HomePage(
onJumpToDetail: (videoModel){
print(11);
this.videoModel=videoModel;
notifyListeners();
},
)),//括号内跳转事件的添加
if(videoModel!=null)
pageWrap(
VideoDetailPage(videoModel!)
),
];
return Navigator(
key: navigatorKey,
pages: pages,
onPopPage: (route,result){
//这里可以控制是否可以返回
if(!route.didPop(result)){
return false;
}
return true;
},
);
}
@override
Future setNewRoutePath(BiliRoutePath path) async{//改了函数的形参变量原来是configuration
this.path=path;
}
/@override
// TODO: implement navigatorKey
GlobalKey? get navigatorKey => throw UnimplementedError();///todo 省略掉
}
// TODO 可缺省,主要应用与web,持有RouteInformationProvider 提供的RouteInformation,可以将其解析位我们定义的数据类型
class BiliRouteInformationParser extends RouteInformationParser{
@override
Future parseRouteInformation(RouteInformation routeInformation) async{
final uri=Uri.parse(routeInformation.location!);
print(‘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";
}
pageWrap(Widget child){
return MaterialPage(
key: ValueKey(child.hashCode),//作用:表示唯一
child: child);
}
import ‘package:flutter/material.dart’;
import ‘package:flutter_app/model/video_model.dart’;
class HomePage extends StatefulWidget {
const HomePage({Key? key,this.onJumpToDetail}) : super(key: key);
final ValueChanged? onJumpToDetail;
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: Column(
children: [
Text(‘首页’),
MaterialButton(
onPressed: () => widget.onJumpToDetail!(VideoModel(11)),
child: Text(‘详情’),
)
],
),
),
);
}
}
class VideoModel{
int vid;
VideoModel(this.vid);
}
import ‘package:flutter/material.dart’;
import ‘package:flutter_app/model/video_model.dart’;
class VideoDetailPage extends StatefulWidget {
final VideoModel videoModel;
const VideoDetailPage(this.videoModel) ;
@override
_VideoDetailPageState createState() => _VideoDetailPageState();
}
class _VideoDetailPageState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: Text(‘视频详情页,vid:${widget.videoModel.vid}’),
),
);
}
}
2回答
-
CrazyCodeBoy
2022-01-24
debug 断点调试下当跳转的时候videoModel是否有值
00 -
CrazyCodeBoy
2022-01-24
代码配置的问题,对照下这块课程源码检查下你的代码实现看是否有出入的地方呢
022022-01-24
相似问题