Flutter实现软键盘与其它区域丝滑切换效果

 更新时间:2024年03月10日 09:06:46   作者:yulittlemoon  
这篇文章主要为大家详细介绍了如何使用Flutter实现软键盘与其它区域丝滑切换效果,文中的示例代码讲解详细,需要的小伙伴可以跟随小编一起学习一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

效果演示

问题产生

本次要解决的问题是实现实现软键盘和其它区域的丝滑切换,我们点击微信的表情和键盘,不难发现输入框可以一直保持稳定,仿佛表情抽屉就藏在软键盘后面。 我刚开始的解决思路是,当软键盘收起展示表情抽屉,当表情抽屉收起后展示软键盘,但很快就发现了问题,软键盘与表情抽屉切换的过程中,会造成页面的震荡

问题分析

我录视频后慢倍速分析,发现原因是键盘收缩同时表情抽屉的container开始上升,但键盘收缩的距离不等于container上升的距离,导致输入框不稳定。 查阅资料后发现安卓的思路是获取软键盘高度,将输入框控制在一个固定高度,但是Flutter各种组件的位置取决于与其它组件的位置关系,除非使用stack图层,才能将输入框设置为固定高度,但这样做会给键盘收起步骤带来困难,因此pass。

解决思路

其实解决方法就在问题分析中,不知道你发现了吗

键盘收缩同时表情抽屉的container开始上升,但键盘收缩的距离不等于container上升的距离,导致输入框不稳定

那我们就让键盘收缩距离等于container上升距离,不就可以保持输入框的高度了吗 我们以语音输入区为例,重要步骤主要有两步

  • 获取键盘的最大高度,即输入框底部的距离,我们设置为InputHeight
  • 获取键盘的实时高度,使用InputHeight-currentKeyboardHeight,即可获得voiceInputHeight的高度,使用Provider实时更新container的高度

provider代码如下

import 'package:flutter/material.dart';  
class ProviderChatContent with ChangeNotifier {
  double _voiceInputHeight = 0.0;

  double get voiceInputHeight => _voiceInputHeight;

  void update_voiceInputHeight(double newHeight) {
    _voiceInputHeight = newHeight;
    notifyListeners();
  }
}

组件代码如下

import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class YourClassName extends StatefulWidget {
  @override
  _YourClassNameState createState() => _YourClassNameState();
}

class _YourClassNameState extends State<YourClassName> with WidgetsBindingObserver {
  Timer? _debounceTimer;
  final FocusNode _focusNode = FocusNode();
  double ContainerHeight = 0.0;
  double InputHeight = 0.0; // 假设这是初始输入框的高度
  double voiceInputHeight = 0.0;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _debounceTimer?.cancel();
    _focusNode.dispose();
    super.dispose();
  }

  // 获取键盘的实时高度
  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
    if (mounted) {
      final provider = Provider.of<ProviderChatContent>(context, listen: false);
      final double currentKeyboardHeight = EdgeInsets.fromWindowPadding(
        WidgetsBinding.instance.window.viewInsets,
        WidgetsBinding.instance.window.devicePixelRatio,
      ).bottom;

      // 设置一个新的计时器
      _debounceTimer?.cancel(); // 取消之前的计时器
      _debounceTimer = Timer(const Duration(milliseconds: 39), () {
        if (currentKeyboardHeight > 0 && _focusNode.hasFocus) {
          setState(() {
            // 更新 ContainerHeight 为 InputHeight 和 currentKeyboardHeight 的最大值
            ContainerHeight = max(InputHeight, currentKeyboardHeight);
          });
        }
      });

      voiceInputHeight = InputHeight - currentKeyboardHeight;
      provider.update_voiceInputHeight(voiceInputHeight);
    }
  }

  @override
  Widget build(BuildContext context) {
    final provider = Provider.of<ProviderChatContent>(context);
    return Scaffold(
      body: Column(
        children: [
          Row(
            // 此处填写输入框和其它代码
          ),
          Container(
            // 此处写你的container
            height: max(provider.voiceInputHeight, 0.0), // 使用最大值确保不会有负数的高度
          ),
        ],
      ),
    );
}

问题升级

我们再往深思考一下,这是软键盘和其中某一个区域转化的思路,如果再加区域2,那区域1、区域2和软键盘直接切换,如何保持输入框高度不变呢 在此我提供一个思路

  • 在Provider中添加变量命名为Container1Show、Container2Show,为bool类型
  • 点击按钮为bool值赋值,同时高度计算沿用上面的方法,只是这次输入框距离底部高度最大值为这三部分的高度之和,而不仅仅是两部分高度之和

以上就是Flutter实现软键盘与其它区域丝滑切换效果的详细内容,更多关于Flutter软键盘切换的资料请关注程序员之家其它相关文章!

相关文章

  • Android仿微信通讯录列表侧边栏效果

    Android仿微信通讯录列表侧边栏效果

    这篇文章主要为大家详细介绍了Android仿微信通讯录列表侧边栏效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Flutter?Shell自动化打包解放双手

    Flutter?Shell自动化打包解放双手

    这篇文章主要为大家介绍了Flutter?Shell自动化打包解放双手概要,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android实现View滑动效果的6种方法

    Android实现View滑动效果的6种方法

    这篇文章主要介绍了Android实现View滑动的6种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Android编程之退出整个应用程序的方法

    Android编程之退出整个应用程序的方法

    这篇文章主要介绍了Android编程之退出整个应用程序的方法,实例分析了Android直接关闭所有的Acitivity并退出应用程序的实现技巧,需要的朋友可以参考下
    2015-12-12
  • Android自定义View实现跟随手指移动的小兔子

    Android自定义View实现跟随手指移动的小兔子

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动的小兔子,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Android微信分享大图遇到的问题的解决方法

    Android微信分享大图遇到的问题的解决方法

    这篇文章主要介绍了Android微信分享大图遇到的问题的解决方法,记录了微信图片分享出错的坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • linphone-sdk-android版本号生成解析

    linphone-sdk-android版本号生成解析

    这篇文章主要为大家介绍了linphone-sdk-android版本号生成解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解Android 折叠屏适配攻略

    详解Android 折叠屏适配攻略

    这篇文章主要介绍了Android 折叠屏适配攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Spi机制在Android开发的应用示例详解

    Spi机制在Android开发的应用示例详解

    这篇文章主要为大家介绍了Spi机制在Android开发的应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Flutter实现自定义下拉选择框的示例详解

    Flutter实现自定义下拉选择框的示例详解

    在一些列表页面中,我们经常会有上方筛选项的的需求,点击出现一个下拉菜单,而在Flutter中,并没有现成的这样的组件,所以最好我们可以自己做一个。本文将利用Flutter实现自定义下拉选择框,需要的可以参考一下
    2022-04-04

最新评论

?


http://www.vxiaotou.com