J'ai une fenêtre de discussion dans l'application Flutter.
Les messages sont présentés sous forme de widgets dans le widget ListView
et j'ai également un widget pour la saisie de message attaché au bas de la fenêtre.
Je veux
ListView
InputWidget
code:
class _MessagesPageState extends State<MessagesPage> { final ScrollController listScrollController = ScrollController(); @override Widget build(BuildContext context) { return Scaffold( .... body: Stack( children: [ ListView.builder( controller: listScrollController .... ), InputWidget()] ); } class InputWidget extends StatelessWidget { final TextEditingController _textEditingController = TextEditingController(); .... Row ( children: [ TextField( controller: _textEditingController ), IconButton(icon: ...., onPressed: (){}) ] )}
3 Réponses :
En ce qui concerne le point 1 de votre question:
Vous pouvez créer une fonction d'écoute pour listScrollController
contenant un appel à un FocusNode
anonyme (idée tirée de cette réponse ), et quand un événement de défilement se produit, le focus sera être extrait de votre TextField
et le clavier sera ignoré:
class InputWidget extends StatelessWidget { InputWidget({Key key,this.controller}) : super(key: key); final ScrollController controller ; final TextEditingController _textEditingController = TextEditingController(); .... Row ( children: [ TextField( controller: _textEditingController ), IconButton(icon: ...., onPressed: (){ controller.jumpTo(controller.position.maxScrollExtent); }) ] )}
Point 2:
Vous remarquerez que j'ai modifié votre InputWidget
pour prendre un ScrollController
comme paramètre, afin que vous puissiez lui passer votre contrôleur ListView
. et lorsque le IconButton
est pressé, listScrollController
sautera à la fin comme vous le souhaitez.
class _MessagesPageState extends State<MessagesPage> { final ScrollController listScrollController = ScrollController(); @override void initState() { listScrollController.addListener(_scrollListener); super.initState(); } _scrollListener() { FocusScope.of(context).requestFocus(FocusNode()); } @override Widget build(BuildContext context) { return Scaffold( .... body: Stack( children: [ ListView.builder( controller: listScrollController .... ), InputWidget(controller: listScrollController)] ); }
merci, il semble que cela fonctionne comme prévu! Je me suis maintenant rendu compte que lorsque le clavier est affiché, certains messages sont débordés par le clavier, je dois donc faire défiler ma ListView en conséquence?
Pas du tout ! au fait j'ai testé le code avant de poster.
Pouvez-vous recommander quelque chose pour question en commentaire?
quel genre de débordement? peux-tu expliquer ?
Certains messages qui ont été vus sans clavier sont désormais masqués derrière le clavier affiché. Donc, quand le clavier apparaît, je dois déplacer les messages vers le haut
Vous pouvez vous référer à cette solution pour modifier votre ListView
stackoverflow.com/questions/53586892/...
c'est facile..Suivez ces étapes ..
StatefullWidget
final ScrollController listScrollController = ScrollController ();
ListView devrait ressembler à ceci:
ListView.builder( controller: listScrollController, reverse: true,
Si vous utilisez l'ordre de modification de Firebase comme ceci:
.orderBy ('horodatage', décroissant: vrai)
Ajoutez ce code dans votre bouton Envoyer
listScrollController.animateTo (0.0, durée: Durée (millisecondes: 300), courbe: Curves.easeOut);
Faites défiler automatiquement votre textField, ajoutez votre textField
et ListView
à l'intérieur de Stack
Pour masquer le clavier lors du défilement de la liste, ajoutez simplement keyboardDismissBehavior . Exemple
ListView( keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, children: [], )