#flutter
Вопрос:
я извлек видео из firestore в flutter,но я не могу изменить порядок извлеченных видео каждый раз , когда пользователь открывает мое приложение, может ли кто-нибудь помочь мне в этом? я пробовал многими способами, наконец, я мог думать о том, чтобы извлекать видео из firebase в списке массивов, а затем перетасовывать данные, но я не понимаю, как именно я могу это сделать, если бы кто-нибудь здесь мог мне помочь, это действительно было бы очень большой помощью для меня .
Это мой код здесь
var videoscollection = FirebaseFirestore.instance.collection('Videos');
И в видео.файл для дротиков
class VideoPage extends StatefulWidget {
@override
_VideoPageState createState() => _VideoPageState();
}
class _VideoPageState extends State<VideoPage> {
Stream mystream;
initState(){
super.initState();
mystream = videoscollection.snapshots();
}
buildmusicalbum(){
return Container(
width: 60,
height: 60,
child: Column(
children: [
Container(
padding: EdgeInsets.all(11.0),
height: 50,
width: 50,
decoration: BoxDecoration(
gradient: LinearGradient(colors:
[Colors.grey[800],Colors.grey[700]]),
borderRadius: BorderRadius.circular(25)
),
child: ClipRRect(
borderRadius: BorderRadius.circular(25),
child: Image(image:
NetworkImage(
'https://i.ytimg.com/vi/Z8oJV_mBY9g/maxresdefault.jpg'),
fit: BoxFit.cover,),
),
)
],
),
);
}
likevideo(String id)async {
String uid;
DocumentSnapshot doc = await videoscollection.doc(id).get();
uid = doc.data()['uid'];
if (doc.data()['likes'].contains(uid)) {
videoscollection.doc(id).update({
'likes': FieldValue.arrayRemove([uid])
}
);
} else {
videoscollection.doc(id).update({
'likes': FieldValue.arrayUnion([uid])
}
);
}
}
sharevideo(String video,String id)async{
var request = await HttpClient().getUrl(Uri.parse(video));
var response = await request.close();
Uint8List bytes = await
consolidateHttpClientResponseBytes(response);
await Share.file('Share to', 'Video.mp4', bytes, 'video/mp4');
DocumentSnapshot doc = await videoscollection.doc(id).get();
videoscollection.doc(id).update({
'sharecount': doc.data()['sharecount'] 1
});
}
download(String video,String id)async{
final status = Permission.storage.request();
if(status.isGranted != null){
final externalDir = await getExternalStorageDirectory();
final id = await FlutterDownloader.enqueue(url: video,
savedDir: externalDir.path,
fileName: "Motivational Quotes and Videos",
showNotification: true,
openFileFromNotification: true,
);
DocumentSnapshot doc = await videoscollection.doc(id).get();
videoscollection.doc(id).update({
'downloadcount': doc.data()['downloadcount'] 1
});
}else{
print("permission denied");
}
}
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;
return Scaffold(
body: StreamBuilder(
stream: mystream,
builder: (context, snapshot) {
if(!snapshot.hasData){
return Center(
child: CircularProgressIndicator(),
);
}
return PageView.builder(
itemCount: snapshot.data.docs.length,
controller: PageController(initialPage:
0,viewportFraction: 1),
scrollDirection: Axis.vertical,
itemBuilder: (context, index) {
String uid;
DocumentSnapshot videos = snapshot.data.docs[index];
uid = videos.data()['uid'];
return Stack(
children: [
//video
VideoPlayerItem(videos.data()['url']),
Column(
children: [
//top section
Container(
height: 100,
child: Row(
crossAxisAlignment:
CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [
Text("Motivational Videos", style:
GoogleFonts.pacifico(
color: Colors.white, fontSize: 17),)
],
),
),
//middle section
Expanded(child: Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: Container(
height: 70,
padding: EdgeInsets.only(left: 20),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:MainAxisAlignment.spaceEvenly,
children: [
Row(
children: [
Icon(Icons.music_note,size:
15,color: Colors.white,),
Text(videos.data()
['songname'],style:
GoogleFonts.pacifico(
color: Colors.white,
fontSize: 15),),
],
),
],
),
),
),
// Right Section
Container(
width: 80,
margin: EdgeInsets.only(top:
MediaQuery.of(context).size.height/3.3),
child: Column(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
InkWell(
onTap:()=>
download(videos.data()['url'],videos.data()
['id']),
child:
Icon(Icons.file_download,size: 35,color:
Colors.white,)),
],
),
Column(
children: [
InkWell(
onTap: ()
=>sharevideo(videos.data()['url'],videos.data()['id']),
child:
Icon(Icons.reply,size: 35,color: Colors.white,)),
],
),
)
],
),
),
],
),),
],
),
],
);
}
);
}
),
);
}
}
class VideoPlayerItem extends StatefulWidget {
final String url;
VideoPlayerItem(this.url);
@override
_VideoPlayerItemState createState() => _VideoPlayerItemState();
}
class _VideoPlayerItemState extends State<VideoPlayerItem> {
VideoPlayerController videoPlayerController;
@override
void initState() {
super.initState();
videoPlayerController = VideoPlayerController.network(widget.url)
..initialize().then((value) {
videoPlayerController.play() ;
videoPlayerController.setLooping(true);
videoPlayerController.setVolume(1);
});
}
@override
void dispose() {
super.dispose();
videoPlayerController.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
color: Colors.black,
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
);
}
}
Пожалуйста, кто-нибудь, помогите мне с этим .
Комментарии:
1. Вы пробовали использовать
shuffle
метод? Подробная информация2. я понятия не имею о методе перетасовки
3. Просто перейдите по ссылке, которую я добавил. Это вам поможет
4. спасибо за вашу любезную помощь
5. я пытался использовать этот метод ,но все, что я получаю, — это ошибки, не могли бы вы, пожалуйста, помочь мне с кодом?