Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在Flatter中暂停来自另一个小部件的视频_Flutter_Dart - Fatal编程技术网

Flutter 如何在Flatter中暂停来自另一个小部件的视频

Flutter 如何在Flatter中暂停来自另一个小部件的视频,flutter,dart,Flutter,Dart,所以我这里有一个项目,显示大量的图像和视频,问题是当用户同时滚动和播放视频时,会破坏整个应用程序的性能,FPS从60下降到30左右。我认为解决这个问题的方法就是在用户滚动时暂停视频。我怎样才能让它这样做呢 我在视频中使用这个插件: 这是父组件,其中包含视频小部件,因此正如您所看到的,它只是在数组中循环并显示图片和图像。我想知道的是:如何让视频小部件知道用户是否在滚动,并且视频小部件内部有一个暂停和播放方法,因此根据用户是否在滚动,它将暂停/播放 (FeedVideoItem=视频小部件) 父窗口

所以我这里有一个项目,显示大量的图像和视频,问题是当用户同时滚动和播放视频时,会破坏整个应用程序的性能,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,
                ),
              )
            ],
          ),
        ],
      ),
    );
  }
}