如何检查当前的PageView是否完全消失而下一个完全出现

大自然

我正在使用Fluter开发一个APP。在APP中,有一个PageViews列表,每个PageView将在出现时加载并播放视频。当任何PageView消失时,它将停止播放视频。现在我有一个问题。当我在PageViews之间缓慢滑动时,将同时有两个PageView。每个PageView都显示一部分。但是所有两个PageView都在播放视频。我想知道是否可以检查当前的PageView是否完全消失,然后停止播放视频。当下一个PageView完全显示时,它将开始播放视频。因此它将不会同时在两个PageView中播放视频。有人可以帮助我吗?

import 'package:video_player/video_player.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());


class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MultiplePage(),
    );
  }
}

class MultiplePage extends StatefulWidget {
  @override
  _MultiplePageState createState() => _MultiplePageState();
}

class _MultiplePageState extends State<MultiplePage> {
  PageController _controller;

  void scrollListener() {
    if (_controller.page == _controller.page.roundToDouble()) {
      print(_controller.page);
    }
  }

  @override
  void initState() {
    super.initState();
    _controller = PageController()..addListener(scrollListener);
  }

  @override
  Widget build(BuildContext context) {
    return PageView.builder(
      controller: _controller,
      scrollDirection: Axis.vertical,
      itemBuilder: (context, position) {
        return VideoApp();
      },
    );
  }
}

class VideoApp extends StatefulWidget {
  @override
  _VideoAppState createState() => _VideoAppState();
}

class _VideoAppState extends State<VideoApp> {
  VideoPlayerController _controller;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.network(
        'http://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4')
      ..initialize().then((_) {
        // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
        setState(() {
          _controller.play();
        });
      });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Video Demo',
      home: Scaffold(
        body: Center(
          child: _controller.value.initialized
              ? AspectRatio(
            aspectRatio: _controller.value.aspectRatio,
            child: VideoPlayer(_controller),
          )
              : Container(),
        ),
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
    _controller.pause();
    _controller.dispose();
  }
}
海尔

使用PageController检查页面是否完全翻转。

在此处输入图片说明

import 'package:video_player/video_player.dart';
import 'package:flutter/material.dart';
import 'package:sprintf/sprintf.dart';
import 'package:preload_page_view/preload_page_view.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MultiplePage(),
    );
  }
}

class MultiplePage extends StatefulWidget {
  @override
  _MultiplePageState createState() => _MultiplePageState();
}

class _MultiplePageState extends State<MultiplePage> {
  PreloadPageController _controller;
  int current = 0;
  bool isOnPageTurning = false;

  void scrollListener() {
    if (isOnPageTurning &&
        _controller.page == _controller.page.roundToDouble()) {
      setState(() {
        current = _controller.page.toInt();
        isOnPageTurning = false;
      });
    } else if (!isOnPageTurning && current.toDouble() != _controller.page) {
      if ((current.toDouble() - _controller.page).abs() > 0.1) {
        setState(() {
          isOnPageTurning = true;
        });
      }
    }
  }

  @override
  void initState() {
    super.initState();
    _controller = PreloadPageController();
    _controller.addListener(scrollListener);
  }

  @override
  Widget build(BuildContext context) {
    return PreloadPageView.builder(
      controller: _controller,
      scrollDirection: Axis.vertical,
      preloadPagesCount: 3,
      itemBuilder: (context, pageIndex) {
        return VideoApp(
          pageIndex: pageIndex,
          currentPageIndex: current,
          isPaused: isOnPageTurning,
        );
      },
    );
  }
}

class VideoApp extends StatefulWidget {
  VideoApp({
    this.pageIndex,
    this.currentPageIndex,
    this.isPaused,
  });

  final int pageIndex;
  final int currentPageIndex;
  final bool isPaused;

  @override
  _VideoAppState createState() => _VideoAppState();
}

class _VideoAppState extends State<VideoApp> {
  VideoPlayerController _controller;
  bool initialized = false;

  @override
  void initState() {
    super.initState();
    print(sprintf("init: %d", [widget.pageIndex]));
    _controller = VideoPlayerController.network(
        "http://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4")
      ..initialize().then((_) {
        setState(() {
          _controller.setLooping(true);
          initialized = true;
        });
      });
  }

  @override
  Widget build(BuildContext context) {
    if (widget.pageIndex == widget.currentPageIndex &&
        !widget.isPaused &&
        initialized) {
      _controller.play();
    } else {
      _controller.pause();
    }

    return MaterialApp(
      title: 'Video Demo',
      home: Scaffold(
        body: Container(
          alignment: Alignment.center,
          decoration: BoxDecoration(
            border: Border.all(
              color: Colors.blueAccent,
            ),
          ),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              Text('is paused: ${widget.isPaused.toString()}'),
              Text('currentPageIndex: ${widget.currentPageIndex.toString()}'),
              Text('pageIndex: ${widget.pageIndex.toString()}'),
              _controller.value.initialized
                  ? AspectRatio(
                      aspectRatio: _controller.value.aspectRatio,
                      child: VideoPlayer(_controller),
                    )
                  : Container(
                      decoration: BoxDecoration(color: Colors.black),
                    ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    print(sprintf("dispose: %d", [widget.pageIndex]));
    super.dispose();
    _controller.dispose();
  }
}

...

如果有人要搜索相同的答案,则使用的软件包为:

video_player: ^0.10.1+3
http: ^0.12.0+2
sprintf: ^4.0.2
preload_page_view: ^0.1.4

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无线完全消失

检查下一个值是否等于python循环中的当前值?

检查当前数字是否低于下一个 | 参数OutOfRangeException | C#

在转到下一个语句之前,如何完全运行if语句?

如何在下一个内容淡入之前使第一个内容完全淡出?

在Java中检查下一个输入是否同时是>和<时,如何检查下一个输入是否为整数?

jQuery:检查下一个元素是否存在

检查下一个元素是否是特定元素

jQuery在父级中查找下一个但不是完全下一个

如何选择当前元素的下一个元素

如何检查是否选中了下一个复选框?

如何在iOS中检查是否已导航到下一个UIViewController?

如何检查数组中是否存在某个值并获取下一个值?

如何检查下一个单词是否为数字以确定动作

如何检查循环中的“下一个”字段是否相同?

配合面板完全消失

JTextField不会完全消失

如何检查for循环中的下一个迭代?

当下一个出现时,Google Map Direction路线不会消失

如何检查一个类是否完全符合给定的一组特征?

检查下一个周期是否从上一个周期的末尾开始

检查列表的下一个元素是否与前一个相同

如何在Flutter中使用PageView使上一个和下一个项目可见?

[删除] 从 JSON 字典中删除一个项目会留下一个空的字典:`{}`。我如何完全删除它?

如何检查用户在symfony2中是否完全具有一个角色?

检查当前时间与下一个5分钟之间的时差

在当前选择器之后选择下一个出现的类

一旦不再可点击,如何使下一个按钮消失?

如何转到当前编辑器选项卡中的下一个/上一个出现的位置?