当前位置:网站首页>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);
});
}
```
\
边栏推荐
- JVS开发套件产品定位
- A Week of Wonderful Content Sharing (Issue 14)
- Wearing detection and action recognition of protective gear based on pose estimation
- 初识QEMU
- Full GC (Ergonomics)排查分析
- sqlalchemy 判断一个array 类型的字段是否和一个array有至少一个一致的数据
- 函数的参数
- vivado里那些看不懂的原语
- PyQt5 rapid development and actual combat 9.7 Automated testing of UI layer
- Encapsulation of conversion between Json and objects (Gson)
猜你喜欢
365天挑战LeetCode1000题——Day 044 最大层内元素和 层次遍历
Markdown编辑器语法
2022年最新重庆建筑安全员模拟题库及答案
ASM module in SAP Ecommerce Cloud Spartacus UI and Accelerator UI
想吃菌子,当然是自己上山找了
Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
NameNode (NN) 和SecondaryNameNode (2NN)工作机制
SAP ABAP OData 服务如何支持 $filter (过滤)操作试读版
ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your
小试牛刀—猜数字游戏
随机推荐
小试牛刀—猜数字游戏
基于verilog的CRC校验(汇总)
【Shader】Shader官方示例[通俗易懂]
最长算术(暑假每日一题 11)
Hybrid brain-computer interface system based on steady-state visual evoked potentials and attentional EEG
【OpenCV】-边缘检测汇总示例
亲测可用!!!WPF中遍历整个窗口的所有TextBox组件,对每个输入框做非空判断。
PyQt5 rapid development and actual combat 9.7 Automated testing of UI layer
WPF中TabControl动态获取当前选中的TabItem
全动力学约束的机器人高效时间最优轨迹规划
尚硅谷–MySQL–基础篇(P1~P95)
CWE4.8 -- 2022年危害最大的25种软件安全问题
Two methods of NameNode failure handling
0x80070570文件或目录损坏且无法删除(0x80070091怎么删除)
PyQt5 rapid development and actual combat 10.1 Get city weather forecast
PAT考试总结(考试心得)
建情人节表白网站(超详细过程,包教包会)
Double non-one into bytes!!Pure dry goods sharing
ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)
Use IN List Population in Your JDBC Application to Avoid Cursor Cache Contention Issues