flutter-完美解決鍵盤彈出遮擋輸入框的問題

文章目錄

  • 1. 前言
  • 2. 借助 Scaffold 的特性自動調整
  • 3. 使用 MediaQuery 精準控制抬升高度
    • 3.1. 底部抽屜內輸入框的方案
  • 4. 注意事項
  • 5. 總結

1. 前言

在 Flutter 的開發過程中,經常會碰到某一個頁面有個 TextField 輸入組件,點擊的時候鍵盤會彈起來,這時候頁面應該需要抬升和鍵盤一樣的高度,好展示輸入內容,不然輸入內容就會被鍵盤遮擋。還有特殊場景,比如一個底部抽屜彈框,里面有 TextField 輸入組件,此時也要抬升頁面以方便輸入,這種場景下,如何完美解決呢?

其實,Flutter 提供了原生的解決方案,通過 Scaffold 組件的特性結合 MediaQuery 動態獲取鍵盤高度,就能輕松實現輸入框隨鍵盤抬升的效果。本文將從基礎場景到特殊場景,詳細講解這一方案的實現原理和具體操作。
鍵盤彈出

2. 借助 Scaffold 的特性自動調整

Scaffold 是 Flutter 頁面布局的基礎組件,它內置了處理鍵盤彈出的機制,當鍵盤彈出時,會自動調整頁面布局以避免輸入框被遮擋,其核心在于resizeToAvoidBottomInset屬性(默認值為 true)。

resizeToAvoidBottomInset: true時,Scaffold 會根據鍵盤的高度自動調整自身尺寸,將底部被鍵盤遮擋的部分向上抬升,確保輸入框可見。如下代碼,當點擊 TextField 彈出鍵盤時,Scaffold 會自動向上收縮,使輸入框位于鍵盤上方,避免被遮擋:

Scaffold(?resizeToAvoidBottomInset: true,body: Column(?mainAxisAlignment: MainAxisAlignment.end, // 輸入框在頁面底部?children: [?TextField(?decoration: const InputDecoration(?hintText: '請輸入內容',?border: OutlineInputBorder(),?),?),?],?),?
)

若需要關閉這一特性(例如某些自定義布局場景),可將其設為 false,此時鍵盤彈起,頁面不會被擠壓。

3. 使用 MediaQuery 精準控制抬升高度

對于特殊場景(如底部抽屜、自定義彈窗中的輸入框),僅依賴 Scaffold 的自動調整可能無法滿足需求。此時,可通過 MediaQuery.of(context).viewInsets.bottom 動態獲取鍵盤高度,手動調整輸入框所在容器的底部內邊距,實現精準抬升。如下代碼:

Container(?padding: EdgeInsets.only(?bottom: MediaQuery.of(context).viewInsets.bottom, // 該底部內邊距等于鍵盤高度?),?child: TextField(?decoration: const InputDecoration(?hintText: '請輸入內容',?border: OutlineInputBorder(),?),?),?
)

原理解析

MediaQuery.of(context).viewInsets 用于獲取屏幕邊緣被系統 UI 遮擋的區域尺寸,其中 bottom 屬性在鍵盤彈出時會返回鍵盤的高度(單位為邏輯像素),鍵盤收起時則為 0。?
利用這一特性,給輸入框所在的容器添加底部內邊距,值等于鍵盤高度,即可讓容器隨鍵盤同步抬升。

3.1. 底部抽屜內輸入框的方案

如下代碼:

class ButtomPopupPageState extends State<ButtomPopupPage> {/// 焦點final FocusNode myFocusNode = FocusNode();/// 文字final TextEditingController inputText = TextEditingController();/// 輸入框滾動控制器final ScrollController inputController = ScrollController();/// 打開彈窗void handleShowPopup() {showModalBottomSheet(context: context,clipBehavior: Clip.antiAlias,barrierColor: Colors.black.withAlpha(127),shape: RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(20),topRight: Radius.circular(20),),),backgroundColor: const Color(0xFF232323),isScrollControlled: true, // 允許抽屜高度自適應內容enableDrag: false,builder: (BuildContext context) {return Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), // 適配鍵盤高度child: Container(height: 238,color: Colors.white,padding: EdgeInsets.all(16),child: Column(children: [Container(height: 110,clipBehavior: Clip.antiAlias,padding: EdgeInsets.symmetric(horizontal: 20, vertical: 12),decoration: BoxDecoration(color: const Color(0xFFEEF4FA),borderRadius: BorderRadius.circular(16),),child: TextField(expands: true,scrollController: inputController,controller: inputText,focusNode: myFocusNode,// 設置為 null 表示多行輸入maxLines: null,maxLength: 1000,keyboardType: TextInputType.multiline,textInputAction: TextInputAction.done,autofocus: false,decoration: InputDecoration(isCollapsed: true,contentPadding: EdgeInsets.zero,hintText: '請輸入......',// 去除輸入框底部的字符計數counterText: '',hintStyle: TextStyle(color: Color(0xff728BA4)),border: InputBorder.none,),cursorColor: Color(0xff1E1E1E),style: TextStyle(fontSize: 18,fontWeight: FontWeight.w500,color: Color(0xff1E1E1E),),onChanged: (text) {},onTapOutside: (PointerDownEvent _) {// 點擊輸入框外界主動失去焦點myFocusNode.unfocus();},),),// 確定按鈕Padding(padding: EdgeInsets.symmetric(vertical: 20),child: Container(alignment: Alignment.center,height: 56,decoration: BoxDecoration(borderRadius: BorderRadius.circular(28),color: Color(0xFF4165F1),),child: Text('確認'),),),],),),);});}Widget build(BuildContext context) {return Column(children: [Expanded(child: Container(alignment: Alignment.center,decoration: const BoxDecoration(color: Colors.white),child: TextButton(onPressed: handleShowPopup,child: const Text('點擊彈出',style: TextStyle(color: Colors.black, fontSize: 20),),),),),],);}
}

4. 注意事項

  • 確保布局結構合理,輸入框所在容器的高度能夠隨內邊距調整(如使用 Column(mainAxisSize: MainAxisSize.min))。?
  • 在底部抽屜中必須設置 isScrollControlled: true,否則可能因高度限制導致適配失效。?

5. 總結

核心在于利用系統提供的布局特性和動態高度獲取:?

  • 基礎場景:直接使用 Scaffold,依賴其默認的 resizeToAvoidBottomInset: true 特性,即可實現頁面自動抬升,適用于大多數常規頁面。?
  • 特殊場景:對于底部抽屜、自定義彈窗等獨立布局,通過 MediaQuery.of(context).viewInsets.bottom 獲取鍵盤高度,給輸入框容器添加對應底部內邊距,實現精準適配。?

通過這兩種方案的結合,無論是常規頁面還是特殊彈窗中的輸入框,都能完美避開鍵盤遮擋,為用戶提供流暢的輸入體驗。Flutter 的這套原生解決方案無需依賴第三方庫,性能更優,是處理鍵盤遮擋問題的首選方式。


本次分享就到這兒啦,我是鵬多多,如果您看了覺得有幫助,歡迎評論,關注,點贊,轉發,我們下次見~

往期文章

  • vue中ref的詳解以及react的ref對比
  • css使用aspect-ratio制作4:3和9:16和1:1等等比例布局
  • Web前端頁面開發阿拉伯語種適配指南
  • flutter-使用extended_image操作圖片的加載和狀態處理以及緩存和下載
  • flutter-制作可縮放底部彈出抽屜評論區效果
  • flutter-實現Tabs吸頂的PageView效果
  • Vue2全家桶+Element搭建的PC端在線音樂網站
  • 助你上手Vue3全家桶之Vue3教程
  • 超詳細!vue組件通信的10種方式
  • 超詳細!Vuex手把手教程
  • 使用nvm管理node.js版本以及更換npm淘寶鏡像源
  • vue中利用.env文件存儲全局環境變量,以及配置vue啟動和打包命令

個人主頁

  • CSDN
  • GitHub
  • 掘金
  • 簡書
  • 博客園

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91232.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91232.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91232.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習筆記(四)——聚類算法KNN、Kmeans、Dbscan

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。概念部分大部分來自于機器學習菜鳥教程&#xff0c;公式部分也會參考機器學習書籍、阿里云天池。機器學習如果只啃概…

【C#】事務(進程 ID 64)與另一個進程被死鎖在鎖資源上,并且已被選作死鎖犧牲品。請重新運行該事務。不能在具有唯一索引“XXX_Index”的對象“dbo.Test”中插入重復鍵的行。

&#x1f339;歡迎來到《小5講堂》&#x1f339; &#x1f339;這是《C#》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。&#x1f339; &#x1f339;溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01;&#…

LeetCode Hot 100 搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣&#xff1a;每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。給你一個整數 target &#xff0c;如果 target 在矩陣中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。示例…

python畢設高分案例:基于機器學習的抑郁癥數據分析與預測系統,flask框架,算法包括XGboost模型、梯度提升樹模型等

1 緒論 1.1 課題研究背景和意義 1.1.1 研究背景 在醫療行業不斷發展的當下&#xff0c;數據量呈現出爆炸式增長&#xff0c;醫學數據的復雜性和多樣性也達到了前所未有的程度。電子病歷系統記錄了患者豐富的診療信息&#xff0c;醫學影像技術如 CT、MRI 等生成海量的圖像數據…

STM32與ADS1256多通道數據采樣原理及控制程序

好的,使用 STM32 與 ADS1256 通信讀取多通道電壓是精密數據采集的常見方案。ADS1256 是一款高精度、24 位、8 通道(或差分 4 通道)的 ΔΣ ADC,非常適合需要高分辨率的應用(如傳感器信號、醫療儀器等)。 以下是對整個過程的詳細分析及基于 STM32 HAL 庫的程序示例: 核…

Spring Boot 3.5.x 使用 SpringDoc 2 / Swagger3

這篇文章資料來自于網絡&#xff0c;對部分知識整理&#xff0c;這里只是記錄一下&#xff0c;僅供參考 為什么要用 Swagger Swagger 的核心思想是通過定義和描述 API 的規范、結構和交互方式&#xff0c;以提高 API 的可讀性、可靠性和易用性&#xff0c;同時降低 API 開發的難…

@RefreshScope 核心原理深度解析:Spring Boot 的動態魔法

讓我們通過全新的原理圖解和代碼級分析&#xff0c;揭開RefreshScope實現配置熱更新的神秘面紗&#xff01;一、工作原理全景圖&#xff08;優化版&#xff09; #mermaid-svg-50lhLlOFeSRIWnLn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px…

萬字詳解——OSI七層模型:網絡通信的完整架構解析

OSI七層模型&#xff1a;網絡通信的完整架構解析OSI&#xff08;Open Systems Interconnection&#xff09;七層模型是計算機網絡領域最基礎、最權威的參考框架。它由國際標準化組織&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在為不同廠商、不同技術的網絡設備和系…

一個人開發一個App(OpenApi)

為了少寫代碼&#xff0c;統一前后端的網絡層&#xff0c;我使用了OpenApi設計restful接口。然后用openapi-generator來生成flutter的代碼。生成go代碼用的是oapi-codegen,它對go更友好一些。 我們直接在api.yml中設計接口&#xff0c;所有的返回值與請求者都提取到components里…

光伏氣象監測系統:助力光伏發電的智慧大腦

光伏氣象監測系統&#xff1a;助力光伏發電的智慧大腦 柏峰【BF-GFQX】在全球積極推動能源轉型、大力倡導 “雙碳” 目標的當下&#xff0c;光伏發電憑借其清潔、可再生的顯著優勢&#xff0c;宛如一顆冉冉升起的新星&#xff0c;在能源領域迅速嶄露頭角&#xff0c;得以廣泛推…

SpringCloud01——項目演變、微服務遠程調用三種方式、springcloud介紹、nacos注冊中心

目錄 一、項目架構演變過程 1、單體應用架構 2、垂直應用架構 3、分布式服務架構 4、流動計算架構&#xff08;SOA架構&#xff09; 5、微服務架構 二、如何實現微服務遠程調用 1、HttpClient工具類&#xff08;springboot中&#xff09; 形式1&#xff1a;調用第三方…

Oracle 和 MySQL 中的日期類型比較

Oracle 和 MySQL 都提供了多種日期和時間數據類型&#xff0c;但它們在實現和功能上有一些差異。以下是兩者的主要日期類型對比&#xff1a;Oracle 日期類型DATE存儲日期和時間&#xff08;精確到秒&#xff09;格式&#xff1a;YYYY-MM-DD HH24:MI:SS示例&#xff1a;TO_DATE(…

基于 Redis 實現共享 Session 登錄的多種方法與實踐

全文目錄&#xff1a;開篇語**前言****1. 什么是共享 Session 登錄&#xff1f;****2. 基于 Redis 實現共享 Session 的基本方法****2.1 通過 Redis 存儲 Session 數據****2.1.1 基本流程****2.1.2 示例代碼&#xff08;Java Spring Boot Redis&#xff09;****3. 使用 Redis…

spring cloud + easyRules 零基礎搭建智能規則引擎

你是否曾想過在項目中嵌入一套輕量級且高度可擴展的規則引擎&#xff0c;輕松實現動態化的業務決策&#xff1f;在金融、電商、政務等領域&#xff0c;風險控制是業務安全的核心。傳統硬編碼方式很難應對復雜多變的風控需求&#xff0c;而規則引擎允許我們將這些規則獨立出來&a…

AI應用:電路板設計

Diode Computers 公司 Diode Computers是一家專注于利用AI技術進行定制電路板設計和制造的公司&#xff0c;提供從概念到量產的全流程服務。其核心優勢在于將電路板設計轉化為AI可理解的代碼形式&#xff0c;大幅提升設計效率并降低傳統EDA工具的使用門檻 0。 核心服務 設計與制…

RocketMQ學習系列之——客戶端消息確認機制

一、客戶端使用MQ基本代碼示例1、添加maven依賴<dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5.3.0</version> </dependency>2、生產者代碼示例public class Produc…

[leetcode] 組合總和

39. 組合總和 - 力扣&#xff08;LeetCode&#xff09; i class Solution {int aim;vector<vector<int>> ret;vector<int> path; public:vector<vector<int>> combinationSum(vector<int>& nums, int target) {aim target;dfs(nums…

新能源行業B端極簡設計:碳中和目標下的交互輕量化實踐

新能源行業B端極簡設計&#xff1a;碳中和目標下的交互輕量化實踐內容摘要在新能源行業&#xff0c;碳中和目標正推動著企業追求更高的運營效率和更低的資源消耗。然而&#xff0c;傳統的B端交互設計往往復雜繁瑣&#xff0c;不僅增加了用戶的操作成本&#xff0c;還可能導致資…

減速機:自動化生產線的“精密傳動心臟”

減速機作為自動化生產線的核心傳動部件&#xff0c;通過調節轉速與扭矩實現設備精準控制&#xff0c;其在自動化生產線中發揮著關鍵作用。以下是其具體應用方式&#xff1a;輸送線驅動在自動化生產線中&#xff0c;輸送線用于運輸物料、半成品或成品&#xff0c;通過減速機可以…

從0到1學PHP(五):PHP 數組:高效存儲與處理數據

目錄一、數組的定義與分類1.1 索引數組1.2 關聯數組1.3 多維數組二、數組的基本操作2.1 數組元素的添加、刪除、修改和訪問2.2 數組指針的操作三、數組處理函數3.1 數組排序函數3.2 數組統計函數3.3 數組過濾與轉換函數一、數組的定義與分類 在 PHP 中&#xff0c;數組是一種非…