Flutter路由传参后初始化VideoControllerWrapper报错及视频加载问题求助
解决Flutter路由传参后初始化视频控制器的错误问题
我来帮你搞定这个问题~你遇到的only static member can be accessed in initializers错误,本质是Dart不允许在类的成员初始化阶段访问非静态的实例变量——因为这个阶段实例还没完全构造完成,变量还没被赋值。下面是最合理的修复方案,还能优化你的代码结构:
核心修复思路
State类本身可以通过widget属性直接访问StatefulWidget的final成员,不需要自己再复制一份title和vidUrl;视频控制器的初始化要放到initState方法里,这个方法是在State对象创建完成后调用的,这时可以安全访问widget的所有属性。
修改后的完整代码
1. 调整MyHomePage StatefulWidget
class MyHomePage extends StatefulWidget { MyHomePage({Key? key, required this.title, required this.vidUrl}) : super(key: key); final String title; final String vidUrl; @override _MyHomePageState createState() => _MyHomePageState(); // 不需要传递参数 }
2. 重构_MyHomePageState类
class _MyHomePageState extends State<MyHomePage> { // 用late标记,表明会在initState里初始化 late VideoControllerWrapper videoControllerWrapper; @override void initState() { super.initState(); // 这里可以安全访问widget的属性 videoControllerWrapper = VideoControllerWrapper( DataSource.network(widget.vidUrl, displayName: widget.title), ); SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.top]); } @override void dispose() { // 别忘了释放视频控制器资源!之前的代码漏了这一步 videoControllerWrapper.dispose(); SystemChrome.restoreSystemUIOverlays(); super.dispose(); } @override Widget build(BuildContext context) { return Stack( children: <Widget>[ Center( child: NeekoPlayerWidget( onSkipPrevious: () { print("skip"); videoControllerWrapper.prepareDataSource( DataSource.network( widget.vidUrl, displayName: widget.title), ); }, videoControllerWrapper: videoControllerWrapper, actions: <Widget>[ IconButton( icon: const Icon(Icons.share, color: Colors.white), onPressed: () { print("share"); }, ), ], ), ), ], ); } }
关键说明
- 移除了State类自己的
title和vidUrl成员,直接用widget.title和widget.vidUrl访问,避免了变量同步的问题。 - 用
late修饰videoControllerWrapper,告诉Dart这个变量会在运行时初始化,不会为null。 - 在
dispose方法里添加了videoControllerWrapper.dispose(),这很重要!否则会造成资源泄漏。 - 为什么之前改静态变量不行?因为静态变量是类级别的,所有
MyHomePage实例共享同一个值,打开多个页面时会互相干扰,而且静态变量无法依赖实例的传参,自然加载不了正确的视频。
这样修改后,你传递的视频链接就能正常被访问和播放啦~
内容的提问来源于stack exchange,提问作者Teekam Suthar
相关产品推荐
相关产品推荐

