трепетать последний контроллер плеера vl c не работает при удалении элемента в gridview - PullRequest
0 голосов
/ 15 апреля 2020

Я использую Gridview для отображения некоторых видео. Я использовал Gridview.builder для создания сетки, построитель элементов - это объект списка. Однако при удалении среднего элемента в списке возникла проблема.

Пример. Элемент списка - [1,2,3,4]. Если я удалил первый элемент 1, он работает хорошо. В противном случае, если я уберу любой средний предмет, такой как 2, 4-й контроллер игрока vl c больше не будет работать. Я знаю это, потому что я реализовал воспроизведение / паузу при нажатии на экран.

Моя сборка для экрана

Widget build(BuildContext context) {
  return Scaffold(
    resizeToAvoidBottomPadding: false,
    backgroundColor: Theme.of(context).primaryColor,
    appBar: appBarLayout(context),
    body: GridView.builder(
      itemCount: model.getItemCount() + 1,
      padding: EdgeInsets.all(5),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: model.viewMode ? 1 : 2,
        childAspectRatio: 16 / 11,
      ),
      itemBuilder: (context, int index) {
        return GestureDetector(
          child: Container(
            margin: EdgeInsets.all(5),
            color: Colors.black.withOpacity(0.5),
            child: Stack(
              children: <Widget>[
                VlcPlayer(
                  aspectRatio: 16 / 9,
                  url: model.getUrl(index),
                  controller: model.getController(index),
                  placeholder: Center(child: CircularProgressIndicator()),
                ),
                Positioned.fill(
                  child: Align(
                    alignment: Alignment.center,
                    child: AnimatedOpacity(
                      opacity: model.getState(index) ? 0 : 1,
                      duration: Duration(milliseconds: 500),
                      child: Icon(
                        Icons.play_arrow,
                        size: model.viewMode ? 100 : 50,
                        color: Colors.grey.withOpacity(0.6),
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        );
      },
    ),
  );
}

Дескриптор для списка

class CameraDevice {
  CameraDevice({int id, bool state, String username, String password, String name, String url}) {
    this.id = id;
    this.state = state;
    this.username = username;
    this.password = password;
    this.name = name;
    this.url = url;
  }

  int id;
  bool state;
  String username;
  String password;
  String name;
  String url;
  String urlMerge;
  VlcPlayerController controller;
  Uint8List image;
}

List<CameraDevice> _cameras = List();

/// Delete the current camera
delete(int index) async {
  _cameras.removeAt(index);
  notifyListeners();
}

/// Get controller by index
VlcPlayerController getController(int index) {
  if (index >= _cameras?.length) return null;
  return _cameras[index].controller;
}

/// Get url stream after merge with account by index
String getUrl(int index) {
  if (index >= _cameras?.length) return null;
  return _cameras[index].urlMerge;
}

Спасибо серия

...