当前位置:网站首页>Flutter键盘可见性
Flutter键盘可见性
2022-07-31 12:34:00 【华为云】
运行此命令:
使用Flutter:
```
$ flutter pub add flutter_keyboard_visibility
```
这将在你的包的 pubspec.yaml 中添加这样的一行(并运行一个隐式`flutter pub get`):
```
dependencies:
flutter_keyboard_visibility: ^5.3.0
```
或者,您的编辑器可能支持`flutter pub get`。
对键盘可见性变化做出反应。
### 关于 Flutter Web 支持的注意事项
Web 支持[在这里](https://github.com/MisterJimson/flutter_keyboard_visibility/issues/10)是一个悬而未决的问题。目前这个库将只返回`false`网络上的键盘可见性。
## 安装
[安装包](https://pub.dev/packages/flutter_keyboard_visibility/install)
## 用法:对键盘可见性更改做出反应
### 1:在您的`Widget`树中使用构建器
使用 . 根据键盘是否可见构建您的 Widget 树`KeyboardVisibilityBuilder`。
```
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
/// In any of your widgets...
@override
Widget build(BuildContext context) {
return KeyboardVisibilityBuilder(
builder: (context, isKeyboardVisible) {
return Text(
'The keyboard is: ${isKeyboardVisible ? 'VISIBLE' : 'NOT VISIBLE'}',
);
}
);
```
### 2:在您的`Widget`树中使用
`Widget`根据键盘是否可见,`KeyboardVisibilityProvider`在树的顶部附近添加一个来构建树。
```
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
// Somewhere near the top of your tree...
@override
Widget build(BuildContext context) {
return KeyboardVisibilityProvider(
child: MyDemoPage(),
);
}
// Within MyDemoPage...
@override
Widget build(BuildContext context) {
final bool isKeyboardVisible = KeyboardVisibilityProvider.isKeyboardVisible(context);
return Text(
'The keyboard is: ${isKeyboardVisible ? 'VISIBLE' : 'NOT VISIBLE'}',
);
}
```
### 3.直接查询订阅
直接使用类查询和/或订阅键盘可见性 `KeyboardVisibilityController`。
```
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'dart:async';
late StreamSubscription<bool> keyboardSubscription;
@override
void initState() {
super.initState();
var keyboardVisibilityController = KeyboardVisibilityController();
// Query
print('Keyboard visibility direct query: ${keyboardVisibilityController.isVisible}');
// Subscribe
keyboardSubscription = keyboardVisibilityController.onChange.listen((bool visible) {
print('Keyboard visibility update. Is visible: $visible');
});
}
@override
void dispose() {
keyboardSubscription.cancel();
super.dispose();
}
```
## 点击关闭键盘
在树顶`KeyboardDismissOnTap`附近放置一个。`Widget`当用户在当前焦点之外点击时`Widget`,`Widget`将失去焦点并且键盘将被关闭。
```
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
// Somewhere near the top of your tree...
@override
Widget build(BuildContext context) {
return KeyboardDismissOnTap(
child: MyDemoPage(),
);
}
```
默认情况下`KeyboardDismissOnTap`,只会关闭其他交互`Widget`s 未捕获的点击,例如按钮。如果您想关闭任何点击的键盘,包括在交互`Widget`s 上的点击,请设置`dismissOnCapturedTaps`为 true。
```
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
// Somewhere near the top of your tree...
@override
Widget build(BuildContext context) {
return KeyboardDismissOnTap(
dismissOnCapturedTaps: true,
child: MyDemoPage(),
);
}
```
## 测试
### 使用模拟测试
```
@GenerateMocks([KeyboardVisibilityController])
void main() {
testWidgets('It reports true when the keyboard is visible', (WidgetTester tester) async {
// Pretend that the keyboard is visible.
var mockController = MockKeyboardVisibilityController();
when(mockController.onChange)
.thenAnswer((_) => Stream.fromIterable([true]));
when(mockController.isVisible).thenAnswer((_) => true);
// Build a Widget tree and query KeyboardVisibilityProvider
// for the visibility of the keyboard.
bool? isKeyboardVisible;
await tester.pumpWidget(
KeyboardVisibilityProvider(
controller: mockController,
child: Builder(
builder: (BuildContext context) {
isKeyboardVisible =
KeyboardVisibilityProvider.isKeyboardVisible(context);
return SizedBox();
},
),
),
);
// Verify that KeyboardVisibilityProvider reported that the
// keyboard is visible.
expect(isKeyboardVisible, true);
});
}
```
\
边栏推荐
- [core]-ARMV7-A, ARMV8-A, ARMV9-A Architecture Introduction "Recommended Collection"
- Double non-one into bytes!!Pure dry goods sharing
- 榕树贷款GPU 硬件架构
- Build a Valentine's Day confession website (super detailed process, package teaching package)
- dosbox基础使用[通俗易懂]
- MySQL日志中“binlog”的三种格式玩起来真爽
- busybox之reboot命令流程分析
- WPF中报错:“未将对象引用设置到对象的实例。”
- kernel syscore
- ASM外部冗余是否可以替换磁盘
猜你喜欢

小试牛刀—猜数字游戏

PyQt5快速开发与实战10.2 复利计算 && 10.3 刷新博客点击量

Acwing第 62 场周赛【未完结】

通过斐波那契数再谈函数递归2.0

TOGAF10标准读书会第2场活动精彩继续,高光时刻回顾!

PyQt5 rapid development and actual combat 10.2 compound interest calculation && 10.3 refresh blog clicks

攻防演练丨赛宁红方管控平台走进广东三地 助力数字政府网络安全建设

am335x 看门狗驱动&看门狗应用例程序

kernel syscore

Centos7 install mysql5.7
随机推荐
chroot命令
How does the SAP ABAP OData service support the $filter (filter) operation trial version
Anaconda安装labelImg图像标注软件
Error EPERM operation not permitted, mkdir ‘Dsoftwarenodejsnode_cache_cacach两种解决办法
【OpenCV】-边缘检测汇总示例
PyQt5快速开发与实战 10.1 获取城市天气预报
am335x 看门狗驱动&看门狗应用例程序
jmeter性能测试步骤入门(性能测试工具jmeter)
NameNode故障处理的两种方法
CameraToolUnity中两种摄像机的两种观察控制方式
最近两个月谷歌 ad 掉的厉害
NPM 使用介绍
字符函数和字符串函数
kernel syscore
PyQt5快速开发与实战10.2 复利计算 && 10.3 刷新博客点击量
深度学习基本概念
基本语法(一)
Spark GC日志分析
ESP8266-Arduino编程实例-MCP9808数字温度传感器驱动
Use IN List Population in Your JDBC Application to Avoid Cursor Cache Contention Issues