无法跳转

来源: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是否有值

0
0

CrazyCodeBoy

2022-01-24

代码配置的问题,对照下这块课程源码检查下你的代码实现看是否有出入的地方呢

0
2
18010921叶明
一一比对过
2022-01-24
共2条回复

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

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

1722 学习 · 870 问题

查看课程