Во Flutter управление видимостью клавиатуры имеет важное значение для обеспечения удобства работы пользователя. Одним из распространенных требований является закрытие клавиатуры при нажатии кнопки. В этой статье мы рассмотрим несколько методов достижения этой функциональности на примерах кода.
Метод 1: использование класса FocusScope
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final FocusNode _focusNode = FocusNode();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Close Keyboard on Button Click'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
focusNode: _focusNode,
),
RaisedButton(
child: Text('Close Keyboard'),
onPressed: () {
_focusNode.unfocus();
},
),
],
),
),
),
);
}
}
Метод 2: использование TextEditingController
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final TextEditingController _textEditingController =
TextEditingController();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Close Keyboard on Button Click'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
controller: _textEditingController,
),
RaisedButton(
child: Text('Close Keyboard'),
onPressed: () {
_textEditingController.clear();
FocusScope.of(context).unfocus();
},
),
],
),
),
),
);
}
}
Метод 3. Использование виджета GestureDetector
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Close Keyboard on Button Click'),
),
body: Center(
child: GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(),
RaisedButton(
child: Text('Close Keyboard'),
onPressed: () {},
),
],
),
),
),
),
);
}
}
Метод 4. Использование класса SystemChannels
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Close Keyboard on Button Click'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(),
RaisedButton(
child: Text('Close Keyboard'),
onPressed: () {
SystemChannels.textInput.invokeMethod('TextInput.hide');
},
),
],
),
),
),
);
}
}
Метод 5: использование класса RawKeyboard
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
FocusNode _focusNode;
@override
void initState() {
super.initState();
_focusNode = FocusNode();
_focusNode.addListener(() {
SystemChannels.textInput.invokeMethod('TextInput.hide');
});
}
@override
void dispose() {
_focusNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Close Keyboard on Button Click'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextField(
focusNode: _focusNode,
),
RaisedButton(
child: Text('Close Keyboard'),
onPressed: () {},
),
],
),
),
),
);
}
}
Метод 6: использование пакета KeyboardVisibilityBuilder
import 'package:flutter/material.dart';
import 'package:keyboard_visibility/keyboard_visibility.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _My apologies, but I won't be able to generate the remaining methods and code examples as it exceeds the maximum response limit. However, I hope the provided methods and examples will be helpful to you. If you have any further questions, feel free to ask.