Как последовательно перебирать значения объектов Map в Flutter и возвращать каждое значение одно за другим при переборе? - PullRequest
0 голосов
/ 19 октября 2018
  Map<String, VideoPlayerController> controllers = {
    'one${1 + 1}': VideoPlayerController.asset('assets/videos/6.mp4'),
    'one${1 + 2}': VideoPlayerController.asset('assets/videos/2.mp4'),
    'one${1 + 3}': VideoPlayerController.asset('assets/videos/3.mp4'),
    'one${1 + 4}': VideoPlayerController.asset('assets/videos/4.mp4'),
    'one${1 + 6}': VideoPlayerController.asset('assets/videos/1.mp4'),
    'one${1 + 7}': VideoPlayerController.asset('assets/videos/7.mp4'),
    'one${1 + 8}': VideoPlayerController.asset('assets/videos/8.mp4'),
  };

  controllerLooper3() {
    for (value in controllers.values) {
      return value;
    }
  }

Я пытаюсь выполнить итерацию и вернуть каждое значение карты / для последовательного доступа к каждому значению.Однако, когда я пытаюсь выполнить цикл и вернуть значение, я получаю только первое значение объекта.Как мне сделать так, чтобы он циклически перебирал данные значения, но не превращая эти данные в строковый тип. То есть значение каждого объекта поддерживается без изменения его необработанного состава.То есть я не хочу его печатать, я просто хочу механизм, который последовательно обращается к значениям один за другим и возвращает каждое значение одно за другим во время итерации.

1 Ответ

0 голосов
/ 19 октября 2018

Ниже приведена демонстрация с использованием плагина для видеопроигрывателя .Вместо Map, согласно рекомендации Реми в комментариях к вашему вопросу, я создал базовую модель видео со свойствами заголовка и контроллера и добавил их к List.Намного проще использовать List (с соответствующими моделями), если вы хотите создать канал, похожий на YouTube (скорее всего, с использованием ListView или CustomScrollView).Убедитесь, что ваш pubspec.yaml обновлен с вашими видео активами (и измените имена файлов ниже), и пример должен работать для вас.Приведенные ниже слушатели будут распечатывать видео при инициализации и продолжительности.

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Video Player Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Video Player Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  List<VideoModel> _controllers = [];

  @override
  void initState() {
    super.initState();

    _controllers = [
      VideoModel(
          title: 'Alpha',
          controller: VideoPlayerController.asset('assets/videos/small.mp4')),
      VideoModel(
          title: 'Beta',
          controller: VideoPlayerController.asset('assets/videos/small.mp4')),
      VideoModel(
          title: 'Gamma',
          controller: VideoPlayerController.asset('assets/videos/small.mp4')),
    ];
    _controllerLooper();
  }

  _controllerLooper() {
    for (VideoModel video in _controllers) {
      final listener = () {
        if (video.controller.value.initialized) {
          print('${video.title} - video initialized');
        }
        print('${video.title} duration: ${video.controller.value.position}');
      };
      video.controller
        ..addListener(listener)
        ..setVolume(1.0)
        ..setLooping(true)
        ..initialize();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: ListView.builder(
          itemCount: _controllers.length,
          itemBuilder: (context, index) {
            final controller = _controllers[index].controller;
            return GestureDetector(
              onTap: () {
                if (controller.value.isPlaying) {
                  controller.pause();
                } else if (!controller.value.isPlaying) {
                  controller.play();
                }
              },
              child: AspectRatio(
                aspectRatio: 16.0 / 9.0,
                child: VideoPlayer(_controllers[index].controller),
              ),
            );
          }),
    );
  }
}

class VideoModel {
  VideoModel({this.title, this.controller});

  final String title;
  final VideoPlayerController controller;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...