Je souhaite avoir un champ de texte multiligne où certaines données de paragraphe peuvent être renvoyées. J'ai changé le bouton «nouvelle ligne» en bouton «terminé» en utilisant la propriété textInputAction, et bien qu'il appelle onEditingComplete, il ne quitte toujours pas le champ de texte. Je sais que cela a quelque chose à voir avec la concentration, mais je ne suis pas en mesure de comprendre exactement comment le faire.
Voici mon code
TextField(
onChanged: (text){
print('On changed is called');
},
onEditingComplete: (){
print('Editing is done ');
},
textInputAction: TextInputAction.done,
maxLines: 6 ,
controller: textEditingController,
decoration: InputDecoration(
.....
)
),
Comment puis-je me concentrer sur le fait d'appuyer sur terminé? Merci d'avance
4 Réponses :
Rendez simplement maxLine: null comme indiqué ci-dessous
new TextFormField(
controller: controller,
obscureText: obscure,
focusNode: _focusNode,
maxLines: null,
keyboardType: inputtype,
onSaved: (String val) {
text = val;
},
decoration: new InputDecoration(labelText: hintText,
enabledBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.transparent)),
focusedBorder: OutlineInputBorder(borderSide: BorderSide(color: Colors.transparent)),
labelStyle: TextStyle(color: const Color(0xFF0C0738))),
)
L'ajout de maxLine aide à envelopper le texte, mais il ne revient pas et ne quitte pas le champ de texte lorsque vous appuyez sur Terminé
Vous pouvez utiliser FocusNode pour contrôler la mise au point.
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'MyApp',
home: MyWidget(),
);
}
}
class MyWidget extends StatefulWidget {
@override
State<MyWidget> createState() {
return _MyWidget();
}
}
class _MyWidget extends State<MyWidget> {
FocusNode _focusNode;
@override
void initState() {
super.initState();
_focusNode = FocusNode();
}
@override
void dispose() {
super.dispose();
_focusNode.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: TextField(
focusNode: _focusNode,
maxLines: 8,
autofocus:false ,
textInputAction: TextInputAction.done,
onEditingComplete: () {
print("edit");
_focusNode.unfocus();
},
),
)
);
}
}
Salut .. J'ai essayé cela, mais cela ne fonctionne toujours pas! Il ne fait rien en cliquant sur le bouton Terminé
@Denise a mis à jour ma réponse pour afficher tout mon code qui fonctionne bien sur ma machine (iPhone Simulator). Veuillez vérifier la différence entre celui-ci et le vôtre.
Merci ... j'ai compris mon erreur ... Je n'avais pas écrit correctement la fonction initState et la variable _focusnode s'est imbriquée dans une autre fonction. Cette solution a bien fonctionné grâce
L'avez-vous essayé avec la méthode onSubmitted: ?
TextField(
focusNode: myFocus,
onSubmitted: (text) {
myFocus.unfocus();
},
),
Salut .. j'ai essayé cela cependant quand j'essaye ceci, le clavier tape sans que le champ de texte ne soit au point du tout .. et puis le clavier ne revient pas
La réponse acceptée pose un problème. Il exige que vous utilisiez TextInputAction.done , ce qui limite sérieusement la fonctionnalité de TextFormField multiligne. Une solution simple consiste à utiliser un focusNode avec un bascule . La bascule est activée lorsque le champ du formulaire obtient le focus.
En supposant que les éléments de niveau supérieur sont des enfants de la même colonne, quelque chose comme ci-dessous suffirait
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
focusNode.hasFocus
? FlatButton(
color: Colors.green,
child: Row(
children: <Widget>[
FaIcon(
Icons.done,
color: Colors.white,
),
SizedBox(
width: 5.0,
),
Text(
'Done',
style: Theme.of(context).textTheme.body1.copyWith(
fontWeight: FontWeight.w700,
color: Colors.white,
),
),
],
),
onPressed: () {
setState(() {
FocusScope.of(context).unfocus();
});
},
)
: Text(''),
],
),
Card(
child: TextFormField(
focusNode: focusNode, // The focusNode should be properly initiated and disposed
controller: jobSpecificsController,
maxLines: 3,
keyboardType: TextInputType.text,
textInputAction: TextInputAction.done,
decoration: formElementDecoration.copyWith(hintText: 'Please enter the job details.'),
onTap: () {
setState(() {}); // Without this setState, you won't get the toggle in the iOS.
},
),
),
Si vous avez attribué un FocusNode au Textfield, à
onSubmitted:utilisezmyFocusNode.unfocus ()mais, pour être honnête, c'est un peu bizarre, il devrait se déconcentrer quand "fait "est pressé.