Flutter实战-自定义键盘(一)

这篇具有很好参考价值的文章主要介绍了Flutter实战-自定义键盘(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flutter实战-自定义键盘(一)

用了两年的flutter,有了一些心得,从今天开始陆续更新一些案例,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来源和作者)

注意:无特殊说明,flutter版本为3.0+

此文大部分代码内容来自 GitHub - Im-Kevin/cool_ui: 用flutter实现一些我认为好看的UI控件,有Popover,仿Weui的Toast,自定义键盘,感谢大神指路,喜欢的可以去看源码,当然也有区别于原作者的实现,敬请关注。


        为什么需要自定义键盘?自定义键盘可以说在客户端原生开发中有很多地方需要用到,比如做一个数字键盘支持支付业务,特殊内容的输入,或者响应其他特殊需求。作者在开发中也遇到自定义键盘的需求,当时是初学,在github和pub.flutter-io.cn中查了大量的插件,觉得cool_ui中的自定义键盘能满足,再次感谢作者。此文从cool_ui的自定义键盘出发,细说一下解决思路,希望给初学者在自定组件和理解Flutter运行原理提供帮助。

自定义键盘一定是一个Widget组件,那么它至少要实现类似系统键盘的以下功能:

  • 当TextField 聚焦时候弹出键盘组件,将主视图推到键盘上,不至于遮挡
  • 实现内容发送到TextField,也要有“搜索”,“确定”,“下一个”,“收起键盘”等常用键盘指令
当然还有一些细节,比如TextField 失去焦点的时候的时候收起键盘等。
本文先解决如何推起键盘的问题。

一。KeyboardRootWidget

        首先我们要定义一个组件包裹要使用自定义键盘的组件,这个组件可以进行键盘的初始化工作,并定义设置键盘,清楚键盘等功能

1.定义一个StatefulWidget,里面有两个参数的基础设置

class KeyboardRootWidget extends StatefulWidget {
        final Widget child;
        final TextDirection textDirection;  //文字输入的方向,有从右到左,也有从左到右
...

2.键盘初始化KeyboardMediaQuery,下一个章节具体解释

@override
Widget build(BuildContext context) {
// TODO: implement build
return KeyboardMediaQuery(child: Builder(builder: (context) {
CoolKeyboard.init(this, context);

List<Widget> children = [widget.child];
if (_keyboardBuilder != null) {
children.add(Builder(
builder: _keyboardBuilder!,
));
}

...
}

3.设置键盘和清除键盘的方法

setKeyboard 和clearKeyboard ,这两个方法用来设置和清除WidgetBuilder

完整代码如下:

class KeyboardRootState extends State<KeyboardRootWidget> {
WidgetBuilder? _keyboardBuilder;

bool get hasKeyboard => _keyboardBuilder != null;

@override
void initState() {
super.initState();
}

@override
Widget build(BuildContext context) {
// TODO: implement build
return KeyboardMediaQuery(child: Builder(builder: (context) {
CoolKeyboard.init(this, context);

List<Widget> children = [widget.child];
if (_keyboardBuilder != null) {
children.add(Builder(
builder: _keyboardBuilder!,
));
}
return Directionality(
textDirection: widget.textDirection,
child: Stack(
children: children,
));
}));
}

setKeyboard(WidgetBuilder _keyboardBuilder) {
_keyboardBuilder = _keyboardBuilder;
Future.delayed(const Duration(milliseconds: 50)).then((e) {
setState(() {});
});
}

clearKeyboard() {
if (_keyboardBuilder != null) {
_keyboardBuilder = null;
setState(() {});
}
}
}

二。KeybordMediaQuery

我们再回顾一下什么是MediaQuery(如果需要详细了解,可以在我的专栏中搜索此文章),MediaQuery媒体查询会返回MediaQueryData,其中有个一重要数据就是viewInsets,这个是键盘遮挡UI的部分,那我们的思路很清晰,就是在我们自己的键盘弹出的时候更新当前视图的viewInsets值

1.定义一个键盘高度的监听

ValueNotifier<double> keyboardHeightNotifier = CoolKeyboard.getKeyboardHeightNotifier();

@override
void initState(){
super.initState();
CoolKeyboard.getKeyboardHeightNotifier().addListener(onUpdateHeight);
}

2.当键盘高度设置时候,覆盖系统的viewInsets值,就实现了类似系统键盘的弹出功能了。

var data = MediaQuery.maybeOf(context);
data ??= MediaQueryData.fromWindow(WidgetsBinding.instance.window);
var bottom = CoolKeyboard.getKeyboardHeightNotifier().value != 0 ? CoolKeyboard.getKeyboardHeightNotifier().value : data.viewInsets.bottom;
return MediaQuery(
        child: widget.child,
        data:data.copyWith(
        ​​​​​​​viewInsets: data.viewInsets.copyWith(
        ;bottom: bottom
        )

)
);

完整代码如下

class KeyboardMediaQuery extends StatefulWidget{
final Widget child;

KeyboardMediaQuery({required this.child});

@override
State<StatefulWidget> createState() =>KeyboardMediaQueryState();

}

class KeyboardMediaQueryState extends State<KeyboardMediaQuery >{
double keyboardHeight = 0;
ValueNotifier<double> keyboardHeightNotifier = CoolKeyboard.getKeyboardHeightNotifier();

@override
void initState(){
super.initState();
CoolKeyboard.getKeyboardHeightNotifier().addListener(onUpdateHeight);
}

@override
Widget build(BuildContext context) {

// TODO: implement build
var data = MediaQuery.maybeOf(context);
data ??= MediaQueryData.fromWindow(WidgetsBinding.instance.window);
var bottom = CoolKeyboard.getKeyboardHeightNotifier().value != 0 ? CoolKeyboard.getKeyboardHeightNotifier().value : data.viewInsets.bottom;
// TODO: implement build
return MediaQuery(
child: widget.child,
data:data.copyWith(
viewInsets: data.viewInsets.copyWith(
bottom: bottom
)
)
);
}

onUpdateHeight(){
try{
setState(()=>{});
}catch(_){
WidgetsBinding.instance.addPostFrameCallback((_){
setState(()=>{});
});
}
}

@override
void dispose(){
super.dispose();
CoolKeyboard.getKeyboardHeightNotifier().removeListener(onUpdateHeight);
}
}文章来源地址https://www.toymoban.com/news/detail-490877.html

到了这里,关于Flutter实战-自定义键盘(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flutter开发实战-实现自定义按钮类似UIButton效果

    flutter开发实战-实现自定义按钮类似UIButton效果 最近开发过程中需要实现一下UIButton效果的flutter按钮,这里使用的是监听手势点击事件。 GestureDetector属性定义 由于属性太多,我们实现onTapDown、onTapUp、onTapCancel、onTap。 实现自定义按钮类似,我们实现onTapDown、onTapUp、onTapCance

    2024年02月14日
    浏览(28)
  • flutter开发实战-Camera自定义相机拍照功能实现

    flutter开发实战-Camera自定义相机拍照功能实现 在项目中使用image_picker插件时候,在android设备上使用无法默认设置前置摄像头(暂时不清楚什么原因),由于项目默认需要使用前置摄像头,所以最终采用自定义相机实现拍照功能。 在工程的iOS的info.plist文件中添加相机、麦克风

    2024年02月21日
    浏览(36)
  • flutter开发实战-webview自定义标题栏Appbar

    flutter开发实战-webview定义标题栏Appbar 在开发中,使用到webview,在之前实现webview使用,webview页面使用的时自定义标题栏,在上一个webview结合JsBridge实现交互忘记这个标题栏,这里记录一下。 flutter开发实战-webview定义标题栏Appbar,PreferredSizeWidget webview页面使用的时自定义标题

    2024年02月16日
    浏览(27)
  • Flutter 又一元老离职,感谢 Tim 这些年的付出

    前天在 insiders 收到 Tim Sneath 的离职邮件时感觉很震惊,因为他绝对是 Flutter 团队的元老级人物,几乎每次一次 Flutter 版本发布和社区活动都有他的身影,可以说他是我的 Flutter 领路人之一。 Tim 是在 2017 加入 Flutter 团队,作为 Flutter 和 Dart 的 PM 和 UX ,他对于 Flutter 的发展和

    2024年02月07日
    浏览(19)
  • flutter 键盘回收操作

    日常开发中,很多时候键盘不会自动回收,这样会照成非常不好的用户体验,本篇文章,将记录如何统一封装键盘回收功能。

    2024年02月12日
    浏览(29)
  • flutter监听键盘输入做出反应

    2024年02月10日
    浏览(28)
  • flutter 调出键盘和监听输入

    调出键盘: 监听按键: 完整代码

    2024年02月10日
    浏览(31)
  • Flutter 让软键盘不再自动弹起

    1、问题说明: 在开发中,经常遇到这种事,一个页面有输入框,点击输入框后,会弹起软键盘,同时输入框会聚焦,手动收起软键盘后,点击另一个按钮前往下一个页面或者显示一个弹窗,返回或者关闭弹窗后,由于输入框仍然有焦点,软键盘又会自动弹起,非常影响使用

    2024年02月14日
    浏览(37)
  • 轻松掌握Flutter中的键盘操作技巧

    嗨!这里是 甜瓜看代码 ,我们来聊聊如何避免你的用户在键盘弹起时受到惊吓。   我们都知道,在Flutter中,可以通过TextField或TextFormField来实现文本输入框。但是,这些输入框与键盘之间的交互可能会导致一些棘手的问题,例如键盘覆盖输入框、滚动问题等等。下面是一

    2024年02月11日
    浏览(30)
  • Flutter开发 键盘弹起导致底部溢出问题

            flutter版本:3.7.12         表现:登录页为从上往下Column布局,但是内容不足以撑满一整屏(约70%),键盘弹起的时候导致底部溢出,查了一下资料,都说给Scaffold加上属性 加上后确实不会再出现溢出表现,但是同时页面也没有随着键盘的弹起而弹起,导致一些小屏

    2024年01月17日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包