Zbieram dane wejściowe użytkownika za pomocą a, TextFormField
a gdy użytkownik naciśnie a, FloatingActionButton
co oznacza, że są gotowe, chcę odrzucić klawiaturę ekranową.
Jak wyłączyć automatyczne wyłączanie klawiatury?
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
MyHomePageState createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
TextEditingController _controller = new TextEditingController();
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.send),
onPressed: () {
setState(() {
// send message
// dismiss on screen keyboard here
_controller.clear();
});
},
),
body: new Container(
alignment: FractionalOffset.center,
padding: new EdgeInsets.all(20.0),
child: new TextFormField(
controller: _controller,
decoration: new InputDecoration(labelText: 'Example Text'),
),
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
);
}
}
void main() {
runApp(new MyApp());
}
Odpowiedzi:
Od Flutter w wersji 1.7.8 + poprawka 2, droga jest następująca:
Skomentuj PR o tym:
-> NIE używaj
̶r̶e̶q̶u̶e̶s̶t̶F̶o̶c̶u̶s̶(̶F̶o̶c̶u̶s̶N̶o̶d̶e̶(̶)̶
już.źródło
TextField
i innymi widżetami edycji). Nie wiem dlaczego, ale czasamiunfocus
nie daje to żadnego efektu. Zastąpienie go zaakceptowanym rozwiązaniem (bez innych zmian) rozwiązuje problem. Może jest to związane z lokalizacją, z którejunfocus
dzwoniono. Muszę to wywołać np. Z,CheckBoxListTile.onChanged
aby zamknąć klawiaturę, gdy użytkownik wchodzi w interakcję z widżetem pola wyboru oraz z innych podobnych lokalizacji. Nie pamiętam dokładnej lokalizacji problemu.Uwaga: ta odpowiedź jest nieaktualna. Zobacz odpowiedź na nowsze wersje Fluttera .
Możesz odrzucić klawiaturę, usuwając fokus
TextFormField
i przekazując ją nieużywanemuFocusNode
:źródło
onChanged:
lub w akcji niestandardowego przycisku?FocusScope.of(context).unfocus()
Rozwiązanie z FocusScope nie działa dla mnie. Znalazłem inny:
To rozwiązało mój problem.
źródło
build
metody.W przypadku Fluttera 1.17.3 (stabilny kanał od czerwca 2020 r.) Użyj
źródło
Przykładowa implementacja .unfocus () do automatycznego ukrywania klawiatury podczas przewijania listy
można znaleźć w
https://github.com/flutter/flutter/issues/36869#issuecomment-518118441
Dzięki szotp
źródło
Żadne z powyższych rozwiązań nie działa dla mnie.
Flutter sugeruje to - umieść swój widget w nowym GestureDetector (), na którym dotknięcie spowoduje ukrycie klawiatury, a onTap użyje FocusScope.of (kontekst) .requestFocus (nowy FocusNode ())
źródło
Poniższy kod pomógł mi ukryć klawiaturę
źródło
spróbuj tego gestem dotknięcia
źródło
Ponieważ we Flutterze wszystko jest widżetem, postanowiłem zawrzeć
SystemChannels.textInput.invokeMethod('TextInput.hide');
iFocusScope.of(context).requestFocus(FocusNode());
podejście w krótkim module narzędziowym z widżetem i mieszanką w nim.Za pomocą widżetu możesz owinąć dowolny widżet (bardzo wygodny przy korzystaniu z dobrej obsługi IDE)
KeyboardHider
widżetem:Dzięki miksowaniu możesz wywołać ukrycie klawiatury przed dowolnym stanem lub widżetem podczas dowolnej interakcji:
Po prostu utwórz
keyboard_hider.dart
plik, a widżet i mixin będą gotowe do użycia:źródło
Możesz użyć
unfocus()
metody zFocusNode
klasy.źródło
unfocus
metody. Jeśli nie chcesz spamować tego w swojej aplikacji, możesz użyć innego sposobu, na przykładTextFormField
zdarzenia zmiany lub wzorca reaktywnego, zależy to od architektury aplikacji.Wygląda na to, że różne podejścia do różnych wersji. Używam Fluttera w wersji 1.17.1 i poniższe działa dla mnie.
źródło
źródło
spróbuj użyć kontrolera edycji tekstu. na początku,
a podczas wydarzenia prasowego
spowoduje to odrzucenie klawiatury.
źródło
Podsumowując, jest to działające rozwiązanie dla Fluttera 1.17:
Owiń swój widżet w ten sposób:
źródło