3 Réponses :
Vous avez - VideoPlayerController _controller;
Avant de naviguer vers un autre écran -
@override
void dispose() {
super.dispose();
_controller.pause();
}
OU
si c'est un widget avec état alors vous pouvez remplacer - méthode dispose () .
_controller.pause(); // add this
Navigator.push(
context, MaterialPageRoute(builder: (BuildContext context) => NextPage()));
Si je navigue vers 5 pages différentes, je dois le faire à chaque navigation, ce qui n'est peut-être pas une bonne solution.
jouez-vous une vidéo sur chaque page.? cela doit être fait à partir de l'écran qui lit la vidéo uniquement.
Non, j'ai une page où il y a plusieurs vidéos dans une liste. Maintenant sur cette page, il y a différents onglets et boutons qui me dirigent vers différentes pages.
puis à partir de cette page avant la navigation push - add = _controller.pause (); ou si c'est un widget avec état. alors vous pouvez l'ajouter dans la méthode dispose () également.
La méthode supprimée est appelée lorsque cet objet est définitivement supprimé de l'arborescence. J'ai essayé ça, ça ne marche pas.
la mise au rebut se produira lorsque l'objet sera supprimé ... cela ne fonctionnera pas dans ce cas.
ou vous pouvez remplacer la méthode disposer de votre widget lecteur vidéo:
@override
void dispose() {
super.dispose();
_controller.pause();
}
Vous pouvez faire fonctionner cette méthode en remodelant votre app pour faire du widget du lecteur vidéo le dernier dans l'arborescence de navigation, donc chaque fois que vous revenez en arrière, il est automatiquement mis en pause, j'ai rencontré de nombreux problèmes avec le widget du lecteur. J'ai réussi à résoudre ce problème particulier avec l'approche que je viens de mentionner
La méthode supprimée est appelée lorsque cet objet est définitivement supprimé de l'arborescence. J'ai essayé ça, ça ne marche pas.
Modifier:
Deuxième option:
Alors j'ai trouvé une autre solution. VisibilityDetector
est un "Widget" qui peut encapsuler n'importe quel autre Widget et avertir lorsque la zone visible du widget a changé.
class VideoPlayerItem extends StatefulWidget {
final File file;
VideoPlayerItem(this.file);
@override
_VideoPlayerItemState createState() => _VideoPlayerItemState();
}
class _VideoPlayerItemState extends State<VideoPlayerItem> with RouteAware {
VideoPlayerController _videoPlayerController;
@override
void initState() {
super.initState();
_videoPlayerController = VideoPlayerController.file(widget.file);
_videoPlayerController.initialize().then((_) {
if (mounted) {
setState(() {});
_videoPlayerController.play();
}
});
}
@override
void didChangeDependencies() {
routeObserver.subscribe(this, ModalRoute.of(context));//Subscribe it here
super.didChangeDependencies();
}
/// Called when the current route has been popped off.
@override
void didPop() {
print("didPop");
super.didPop();
}
/// Called when the top route has been popped off, and the current route
/// shows up.
@override
void didPopNext() {
print("didPopNext");
_videoPlayerController.play();
super.didPopNext();
}
/// Called when the current route has been pushed.
@override
void didPush() {
print("didPush");
super.didPush();
}
/// Called when a new route has been pushed, and the current route is no
/// longer visible.
@override
void didPushNext() {
print("didPushNext");
_videoPlayerController.pause();
super.didPushNext();
}
@override
Widget build(BuildContext context) {
return _videoPlayerController?.value?.initialized ?? false
? AspectRatio(
aspectRatio: _videoPlayerController.value.aspectRatio,
child: VideoPlayer(_videoPlayerController),
)
: Container();
}
@override
void dispose() {
routeObserver.unsubscribe(this); //Don't forget to unsubscribe it!!!!!!
super.dispose();
_videoPlayerController.dispose();
}
}
Première option:
En utilisant RouteObserver et RouteAware , votre widget sera informé chaque fois qu'un autre écran est poussé dessus, ou il est repassé en haut.
D'abord , vous devez ajouter un RouteObserver à MaterialApp ou à votre Navigator .
RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
navigatorObservers: [routeObserver], //HERE
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
Ensuite vous devez ajouter le mixin RouteAware à votre widget et vous abonner au RouteObserver.
VisibilityDetector(
key: Key("unique key"),
onVisibilityChanged: (VisibilityInfo info) {
debugPrint("${info.visibleFraction} of my widget is visible");
if(info.visibleFraction == 0){
videoPlayerController.pause();
}
else{
videoPlayerController.play();
}
},
child: VideoPlayer());
)
Salut, j'ai le même problème pour mettre la vidéo en pause dans Listview, comme instagram et facebook J'ai une vidéo dans Listview builder, comment vérifier l'index de visibilité pour lire la vidéo et faire une pause pour rester, veuillez me donner une suggestion.
@ShangariC Les solutions ci-dessus n'ont pas satisfait votre problème?
J'ai utilisé un détecteur de visibilité, cela fonctionne bien lorsque j'ai un message vidéo au hasard à la fois, alors que si j'ai tous les messages avec vidéo, il renvoie 1.0 pour chaque index, donc il est lu en même temps.Veuillez me donner une suggestion.
@ShangariC J'ai également rencontré ce problème et je l'ai résolu en lisant cet artice . Il a besoin d'un peu de modification, mais je suis sûr que vous pouvez le comprendre car il est très proche de la solution finale. Cela vérifiera les éléments visibles dans une zone limitée. En ajustant la zone, vous pouvez vous assurer qu'une seule vidéo est en cours de lecture
Bien sûr que je vais lire cet article, merci pour votre précieuse réponse
L'article ci-dessus fonctionne bien, mais dans mon application, j'ai 3 Listview dans Column, mais j'ai un post vidéo disponible dans 3rd Listview est-il possible de réaliser cette logique ici.
@ShangariC 99,9% des fois, vous pouvez afficher tout ce que vous voulez dans une simple ListView . Y a-t-il une raison spécifique pour laquelle vous ne fusionnez pas vos ListView en un seul?
J'ai une section différente dans singlechildscrollview 1) vue de la liste des sommets avec quelques données 2) vue de la liste des sommets avec quelques données 3) vue de la liste horizontale avec un message comme Facebook cette vue de la liste ne contient que la publication vidéo pour obtenir un index visible à partir de la troisième section.
cette réponse m'a été très utile - car j'avais une liste de vidéos et j'étais confronté à des conditions de course plusieurs fois ... si vous avez une liste de vidéos, définissez l'autoinitialize sur false, la lecture automatique sur false puis videoPlayerController.initialize ( ) .then (() {if (monté) {setState (() {}); _videoPlayerController.play ();}});
Salut, j'ai le même problème pour mettre la vidéo en pause dans Listview, comme instagram et facebook J'ai une vidéo dans Listview builder, comment vérifier l'index de visibilité pour lire la vidéo et faire une pause pour rester, veuillez me donner une suggestion.