Я использую 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;
}
Спасибо серия