我正在将变量传递到其他屏幕,并且我想将其用作videoplayer
的值,但是却遇到此错误Only static members can be accessed in initializes
,我试图找到解决方案,但是到处都找到了将final替换为比static关键字更有效,但id不适用于我,但适用于其他人。我正在按widget.title使用该标题,但是另一方面,我在Text(widget.title,),
中使用了同样的错误,并且在这里效果很好,但在最终videoPlayerController = VideoPlayerController.network(widget.title);
中却无法正常使用
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:firebase_admob/firebase_admob.dart';
import 'package:video_player/video_player.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class ChewieListItem extends StatefulWidget {
final String title;
ChewieListItem({this.title});
bool looping;
@override
_ChewieListItemState createState() => _ChewieListItemState();
}
class _ChewieListItemState extends State<ChewieListItem> {
List data =[];
final videoPlayerController = VideoPlayerController.network(widget.title);
// static videoPlayerController = VideoPlayerController.network(widget.title);
ChewieController _chewieController;
@override
void initState() {
super.initState();
fetchData();
_chewieController = ChewieController(
videoPlayerController: videoPlayerController,
aspectRatio: 16 / 9,
autoInitialize: true,
looping: widget.looping,
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
void fetchData() async {
final response = await http
.get('http://salterz.com/gtv_json/link.json');
if (response.statusCode == 200) {
setState(() {
data = json.decode(response.body);
// Final=dataleft +data +dataright;
});
}
}
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
return Stack(
children: <Widget>[
Chewie(
controller: _chewieController,
),
Text(widget.title,),
],
);
}
@override
void dispose() {
super.dispose();
// IMPORTANT to dispose of all the used resources
videoPlayerController.dispose();
_chewieController.dispose();
}
}
答案 0 :(得分:1)
在对象构造/初始化变量的过程中,它只是一个Dart类,它对小部件等一无所知。
要解决您的问题,只需将title
传递给State,例如
class ChewieListItem extends StatefulWidget {
final String title;
ChewieListItem({this.title});
bool looping;
@override
_ChewieListItemState createState() => _ChewieListItemState(title: title);
}
class _ChewieListItemState extends State<ChewieListItem> {
final String title;
final VideoPlayerController videoPlayerController;
_ChewieListItemState({this.title}): videoPlayerController = VideoPlayerController.network(title);
...
}
initState
中初始化videoPlayerController
Or initialize `VideoPlayerController` in `initState` and destory in `dispose`.
class _ChewieListItemState extends State<ChewieListItem> {
List data =[];
VideoPlayerController videoPlayerController;
ChewieController _chewieController;
@override
void initState() {
super.initState();
videoPlayerController = VideoPlayerController.network(widget.title);
...
}
@override
void dispose() {
super.dispose();
videoPlayerController.dispose();
...
}
..
}
这样,您可以比第一个选项拥有更好的清除效果。我更喜欢第二种选择。
答案 1 :(得分:1)
根据第二种方法,您将无法配置视频播放器。因此,第一种方法会很好用。