Flutter 如何在Flatter中暂停来自另一个小部件的视频
所以我这里有一个项目,显示大量的图像和视频,问题是当用户同时滚动和播放视频时,会破坏整个应用程序的性能,FPS从60下降到30左右。我认为解决这个问题的方法就是在用户滚动时暂停视频。我怎样才能让它这样做呢 我在视频中使用这个插件: 这是父组件,其中包含视频小部件,因此正如您所看到的,它只是在数组中循环并显示图片和图像。我想知道的是:如何让视频小部件知道用户是否在滚动,并且视频小部件内部有一个暂停和播放方法,因此根据用户是否在滚动,它将暂停/播放 (FeedVideoItem=视频小部件) 父窗口小部件:Flutter 如何在Flatter中暂停来自另一个小部件的视频,flutter,dart,Flutter,Dart,所以我这里有一个项目,显示大量的图像和视频,问题是当用户同时滚动和播放视频时,会破坏整个应用程序的性能,FPS从60下降到30左右。我认为解决这个问题的方法就是在用户滚动时暂停视频。我怎样才能让它这样做呢 我在视频中使用这个插件: 这是父组件,其中包含视频小部件,因此正如您所看到的,它只是在数组中循环并显示图片和图像。我想知道的是:如何让视频小部件知道用户是否在滚动,并且视频小部件内部有一个暂停和播放方法,因此根据用户是否在滚动,它将暂停/播放 (FeedVideoItem=视频小部件) 父窗口
@override
Widget build(BuildContext context) {
return SafeArea(
child: SingleChildScrollView(
child: Column(
children: <Widget>[
if (loaded)
if (_feedDatas.length > 1)
for (var item in _feedDatas)
if (item.isImage)
FeedImageItem(
item: item,
)
else
// VIDEO WIDGET
new FeedVideoItem(videoData: item)
else
Center(child: Text('Loading, do hot restart to display')),
],
),
),
);
}
@覆盖
小部件构建(构建上下文){
返回安全区(
子:SingleChildScrollView(
子:列(
儿童:[
如果(已加载)
如果(_feedDatas.length>1)
用于(feedDatas中的var项目)
如果(项目isImage)
FeedImageItem(
项目:项目,,
)
其他的
//视频小部件
新FeedVideoItem(视频数据:item)
其他的
居中(子项:文本('加载,执行热重启以显示'),
],
),
),
);
}
视频小部件(FeedVideoItem):
class FeedVideoItem扩展StatefulWidget{
最终视频数据;
FeedVideoItem({this.videoData}):super();
@凌驾
_FeedVideoItemState createState()=>\u FeedVideoItemState(videoData);
}
类_FeedVideoItemState扩展了状态{
饲料项目;
_FeedVideoItemState(此项);
视频播放控制器\u控制器;
bool startedPlaying=false;
未来的初始视频播放器;
@凌驾
void initState(){
_控制器=VideoPlayerController.network(item.url);
initialiseVideoPlayerFuture=_controller.initialize();
_控制器。设置循环(真);
_控制器。设置音量(1.0);
super.initState();
}
@凌驾
无效处置(){
_controller.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回填充(
填充:仅限常量边集(底部:15.0),
子:列(
儿童:[
堆叠(
儿童:[
未来建设者(
未来:initialiseVideoPlayerFuture,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.done){
回墨槽(
onTap:(){
设置状态(){
if(_controller.value.isPlaying){
_controller.pause();
}否则{
_controller.play();
}
});
},
孩子:AspectRatio(
aspectRatio:_controller.value.aspectRatio,
子项:视频播放器(_控制器),
),
);
}否则{
//TODO:添加占位符图像
}
},
),
墨水池(
子:图标(
_controller.value.isplay?图标。暂停:图标。播放箭头,
颜色:颜色,白色,
),
)
],
),
],
),
);
}
}
您是否尝试检查视频小部件是否有焦点?也许你可以在它丢失时暂停它(例如,用户开始滚动)。你的问题是关于状态管理的。看看这个:
class FeedVideoItem extends StatefulWidget {
final videoData;
FeedVideoItem({this.videoData}) : super();
@override
_FeedVideoItemState createState() => _FeedVideoItemState(videoData);
}
class _FeedVideoItemState extends State<FeedVideoItem> {
FeedItem item;
_FeedVideoItemState(this.item);
VideoPlayerController _controller;
bool startedPlaying = false;
Future<void> initialiseVideoPlayerFuture;
@override
void initState() {
_controller = VideoPlayerController.network(item.url);
initialiseVideoPlayerFuture = _controller.initialize();
_controller.setLooping(true);
_controller.setVolume(1.0);
super.initState();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(bottom: 15.0),
child: Column(
children: <Widget>[
Stack(
children: <Widget>[
FutureBuilder(
future: initialiseVideoPlayerFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return InkWell(
onTap: () {
setState(() {
if (_controller.value.isPlaying) {
_controller.pause();
} else {
_controller.play();
}
});
},
child: AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: VideoPlayer(_controller),
),
);
} else {
//TODO: Add placeholder image
}
},
),
InkWell(
child: Icon(
_controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
color: Colors.white,
),
)
],
),
],
),
);
}
}