Изменение отображаемых данных при использовании ontap в listview flutter

#flutter #dart

Вопрос:

На моей странице я использую столбец, в котором есть контейнер для просмотра видео и просмотра списка видео, я хочу , чтобы при нажатии на элемент списка я хотел изменить контейнер видео на выбранное видео. Я попробовал использовать setState, но не изменил представление. Я использовал YoutubePlayerController для просмотра видео, и в своем состоянии настройки я меняю видео, но не работаю. Как я могу это сделать? Вот мой код.Спасибо за любой пример или предложение.

 import 'package:flutter/material.dart'; import 'package:youtube_player_flutter/youtube_player_flutter.dart'; import 'videolist.dart'; import './models/models.dart'; import 'package:csv/csv.dart' as csv; import 'package:http/http.dart' as http;  class DisplayVideo extends StatefulWidget {  String id;  @override  DisplayVideo(this.id);  _DisplayVideoState createState() =gt; _DisplayVideoState(); }  class _DisplayVideoState extends Statelt;DisplayVideogt; {  Futurelt;Listlt;YoutubeDetailgt;gt; _loadCSV() async {  Maplt;String, Stringgt; allData = {  'login': 'JornaldRem',  'password': 'Aungkokolin7',  };  YoutubePlayerController _controller;  final Uri url = Uri.parse(  'https://raw.githubusercontent.com/JornaldRem/bedtime_story/main/videoId.csv');  final response = await http.get(url);  csv.CsvToListConverter converter =  new csv.CsvToListConverter(eol: 'rn', fieldDelimiter: ',');  Listlt;Listgt; listCreated = converter.convert(response.body);  // the csv file is converted to a 2-Dimensional list  Listlt;YoutubeDetailgt; youtubeDetailList = [];  print("Length______");  print(listCreated.length);  for (int i = 0; i lt; listCreated.length; i  ) {  YoutubeDetail temp = YoutubeDetail(  listCreated[i][0],  listCreated[i][1],  );   youtubeDetailList.add(temp);  }  return youtubeDetailList;  }  void _changevideoId(String url){  String id= url.substring(url.length - 11);  setState(() {  YoutubePlayerController _controller = YoutubePlayerController(  initialVideoId: id,  flags: YoutubePlayerFlags(  autoPlay: true,  mute: false,  ),  );  });  }  @override  Widget build(BuildContext context) {  YoutubePlayerController _controller = YoutubePlayerController(  initialVideoId: widget.id,  flags: YoutubePlayerFlags(  autoPlay: true,  mute: false,  ),  );   return Scaffold(  appBar: AppBar(  elevation: 0,  title: Text('Fairy Tail Video'),  toolbarHeight: 60,  backgroundColor: const Color(0xFF006666),  ),  body: Column(  children: [  Container(  child: YoutubePlayer(  controller: _controller,  liveUIColor: Colors.amber,  ),  ),  Expanded(  child: Container(  child: FutureBuilder(  future: _loadCSV(),  builder: (BuildContext context,  AsyncSnapshotlt;Listlt;YoutubeDetailgt;gt; snapshot) {  if (snapshot.hasData) {  Listlt;YoutubeDetailgt; videoDetail = snapshot.data!;  return ListView.builder(  shrinkWrap: true,  scrollDirection: Axis.vertical,  itemCount: videoDetail.length,  itemBuilder: (_, int index) {  if (index gt; 0) {  return GestureDetector(  child: Container(  height: 80,  child: DisplayVideoView(  videoDetail[index].url,  videoDetail[index].title),  ),  onTap: () =gt;_changevideoId(videoDetail[index].url),  );  } else {  return Container();  }  });  } else {  return Container();  }  }),  ),  ),  ],  ));  } }  class DisplayVideoView extends StatelessWidget {  String videopath;  String title;  DisplayVideoView(this.videopath, this.title);  @override  Widget build(BuildContext context) {  String url = videopath;  String id = url.substring(url.length - 11);  print("Call   ");  print(id);  // TODO: implement build  return Card(  clipBehavior: Clip.antiAlias,  child: Container(  height: 150,  padding: const EdgeInsets.all(0),  child: Row(children: [  Expanded(  flex: 6,  child: Container(  decoration: BoxDecoration(  image: DecorationImage(  image: NetworkImage(  'https://img.youtube.com/vi/$id/mqdefault.jpg'),  fit: BoxFit.fill)),  ),  ),  Spacer(  flex: 1,  ),  Expanded(  flex: 14,  child: Container(  padding: const EdgeInsets.only(top: 2),  child: Column(  crossAxisAlignment: CrossAxisAlignment.start,  mainAxisAlignment: MainAxisAlignment.center,  children: lt;Widgetgt;[  Text(title,  style: TextStyle(  fontSize: 16.0, fontWeight: FontWeight.bold)),  ],  ),  ),  ),  ]),  ),  );  } } 

Ответ №1:

Пример, приведенный в пакете youtube_player_flutter, решает ваш случай. Выполните все шаги, особенно:

 @override  void initState() {  super.initState();  _controller = YoutubePlayerController(  initialVideoId: _ids.first,  flags: const YoutubePlayerFlags(  mute: false,  autoPlay: true,  disableDragSeek: false,  loop: false,  isLive: false,  forceHD: false,  enableCaption: true,  ),  )..addListener(listener);  _idController = TextEditingController();  _seekToController = TextEditingController();  _videoMetaData = const YoutubeMetaData();  _playerState = PlayerState.unknown;  }   void listener() {  if (_isPlayerReady amp;amp; mounted amp;amp; !_controller.value.isFullScreen) {  setState(() {  _playerState = _controller.value.playerState;  _videoMetaData = _controller.metadata;  });  }  }