Как: остановить ListView от перестройки виджета video_player? - PullRequest
0 голосов
/ 14 февраля 2020

Мне удалось получить видео для воспроизведения на веб-сайте flutter-web, однако при прокрутке видео в ListView произойдет перестройка / перезагрузка.

Как остановить video_player (в ListView) из восстанавливается при прокрутке?

Извините за длинный пример кода ... Я не уверен, как его сжать дальше

Любая помощь будет отличной! Спасибо

import 'package:flutter/material.dart';
import '../../widgets/video/chewie_video.dart';
import 'package:video_player/video_player.dart';

class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView(
        children: <Widget>[
          Container(height: 1000),
          Center(
            child: ChewieVideo(
              videoPlayerController:
                  VideoPlayerController.asset('assets/video.mp4'),
            ),
          ),
          Container(height: 1000),
        ],
      ),
    );
  }
}
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class ChewieVideo extends StatefulWidget {
  final VideoPlayerController videoPlayerController;
  final bool looping;

  ChewieVideo({
    @required this.videoPlayerController,
    this.looping,
    Key key,
  }) : super(key: key);

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

class _ChewieVideoState extends State<ChewieVideo> {
  ChewieController _chewieController;

  @override
  void initState() {
    super.initState();
    _chewieController = ChewieController(
      videoPlayerController: widget.videoPlayerController,
      autoInitialize: true,
      aspectRatio: 16 / 9,
      looping: widget.looping,
      errorBuilder: (context, errorMessage) {
        return Center(
          child: Text(
            errorMessage,
            style: TextStyle(color: Colors.white),
          ),
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Chewie(
        controller: _chewieController,
      ),
    );
  }

  @override
  void dispose() {
    super.dispose();
    widget.videoPlayerController.dispose();
    _chewieController.dispose();
  }
}

1 Ответ

0 голосов
/ 15 февраля 2020

Я не уверен, что это хорошее или просто временное исправление, но именно так мне удалось заставить его работать ...

Если вы используете внутри ListView / CustomScrollView, то вам нужно настроить cacheExtent для любого из этих виджетов ... Я установил мой на 1000.

Я не совсем уверен, что происходит, но это работает ...

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: primaryBlack,
      drawer: NavDrawer(),
      body: Scrollbar(
        child: CustomScrollView(
          cacheExtent: 1000,
          slivers: <Widget>[

...

после этого плагины chew ie и video_player не должны перестраивать / обновлять sh внутри ListView

...