}

图1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

例子1 (键盘输入后回调内容)

TextEditingValue(text: ┤额度├, selection: TextSelection(baseOffset: 2, extentOffset: 2, affinity: TextAffinity.downstream, isDirectional: false), composing: TextRange(start: -1, end: -1))

解析2 TextInputConnection 关闭

//判断 _hasInputConnection 是否为空 或者是否已经绑定
void _closeInputConnectionIfNeeded() {
if (_hasInputConnection) {
_textInputConnection.close();
_textInputConnection = null;
_lastKnownRemoteTextEditingValue = null;
}
}

解析3 TextInputConnection 赋值 TextEditingValue

// value.toJSON(), 里面的值返回的是 json
void setEditingState(TextEditingValue value) {
assert(attached);
SystemChannels.textInput.invokeMethod(
‘TextInput.setEditingState’,
value.toJSON(),
);
}
//远程更新数据在需要的时候
void _updateRemoteEditingValueIfNeeded() {
if (!_hasInputConnection)
return;
final TextEditingValue localValue = _value;
if (localValue == _lastKnownRemoteTextEditingValue)
return;
_lastKnownRemoteTextEditingValue = localValue;
_textInputConnection.setEditingState(localValue);
}

TextEditingValue .text 就可以获取到输入的值

解析4 TextInputConnection 中 setEditingState这个函数调用

/// Requests that the text input control change its internal state to match the given state.
void setEditingState(TextEditingValue value) {
assert(attached);
print(" setEditingState ${value.text} ");
SystemChannels.textInput.invokeMethod(
‘TextInput.setEditingState’,
value.toJSON(),
);
}

当控件获取焦点的时候调用此函数。

Future _handleTextInputInvocation(MethodCall methodCall) async {
print(" _handleTextInputInvocation MethodCall ${methodCall.method} ");
if (_currentConnection == null)
return;
final String method = methodCall.method;
final List args = methodCall.arguments;
final int client = args[0];
// The incoming message was for a different client.
if (client != _currentConnection._id)
return;
switch (method) {
case ‘TextInputClient.updateEditingState’:
_currentConnection._client.updateEditingValue(TextEditingValue.fromJSON(args[1]));
break;
case ‘TextInputClient.performAction’:
_currentConnection._client.performAction(_toTextInputAction(args[1]));
break;
default:
throw MissingPluginException();
}
}
上面函数打印得出 只有两个 状态 TextInputClient.updateEditingState 和 TextInputClient.performAction。

TextInputClient.updateEditingState 是获取焦点和内容改变都要调用
TextInputClient.performAction 这个是由点击 如图1 位置上的按钮 状态 才触发
由此得知 没有关于删除按键的监听 和回调。
键盘的类 在 包 import ‘package:flutter/services.dart’; 下需要导入这个才能使用里面的类
其实我是想找出 删除键 的监听 看来是没有了。。。。至少功夫没有白费!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

资料.png
资料图.jpg

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

…(img-S9PoRget-1711817645129)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐