Si j'ai un PageView
, comment puis-je désactiver le comportement de défilement par défaut (glisser) et faire en sorte que l'élément suivant soit défilé dans la vue en appuyant sur un bouton à la place?
Pour désactiver le balayage, vous pouvez définir:
PageView(physics:new NeverScrollableScrollPhysics())
J'ai donc essayé de comprendre cela comme suit, et si quelqu'un a une meilleure solution, veuillez la partager avec nous.
Faire passer un bouton à l'élément suivant dans le PageView
:
Ajoutez un PageController
à votre PageView
et les méthodes animateTo
ou jumpTo
pour accéder à l'élément souhaité lorsque l'utilisateur appuie sur un bouton. J'ai fait en sorte que toute la largeur de la vue actuelle soit le décalage afin que la transition vers l'élément suivant se déroule correctement.
onPressed: () {
c.animateTo(MediaQuery
.of(context)
.size
.width, duration: new Duration(seconds: 1),
curve: Curves.easeIn);
}
Désactivez le comportement de balayage par défaut:
Tout ce que j'ai fait, c'est d'envelopper mon PageView
à l'intérieur IgnorePointer
pour ignorer toute interaction avec l'utilisateur, je n'aime vraiment pas cette solution, cela peut fonctionner correctement dans cet exemple, cependant, dans d'autres situations, je peut souhaiter que l'utilisateur interagisse avec un seul widget dans la page actuellement affichée.
Voici mon exemple de code:
class FirstPage extends StatefulWidget {
@override
_FirstPageState createState() => new _FirstPageState();
}
class _FirstPageState extends State<FirstPage> {
ScrollController c;
@override
void initState() {
super.initState();
c = new PageController();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
floatingActionButton: new Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
new FloatingActionButton(
child: new Icon(Icons.navigate_before), onPressed: () {
//c.animateTo(MediaQuery.of(context).size.width, duration: new Duration(seconds: 1), curve: Curves.easeIn);
c.jumpTo(0.0);
}),
new Container(width: 15.0,),
new FloatingActionButton(
child: new Icon(Icons.navigate_next), onPressed: () {
c.animateTo(MediaQuery
.of(context)
.size
.width, duration: new Duration(seconds: 1),
curve: Curves.easeIn);
}),
],),
appBar: new AppBar(title: new Text("First Page")),
body: new IgnorePointer(child: new PageView(
controller: c,
children: <Widget>[
new Column (
children: <Widget>[new Container (child: new Text("First Item"))
]),
new Container (child: new Text("Second Item")),
],
),),
);
}
}
Toutes suggestions ou modifications sur cette solution sont les bienvenues.