日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解TextField的主要構(gòu)成部分

谷歌開發(fā)者 ? 來源:CNDS技術(shù)社區(qū) ? 作者:戀貓de小郭 ? 2022-03-18 12:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

看完本篇,您不僅會了解到 TextField 的實現(xiàn)和構(gòu)成,還可以學(xué)到很多之前不常用的"奇怪"知識。

在 Flutter 里TextField是一個比較復(fù)雜的控件,而在整個TextField里嵌套了許多不同實現(xiàn)的控件,它們組成了我們常用的輸入框效果,如下圖所示是關(guān)于TextField的主要構(gòu)成部分,也是本篇主要講解的內(nèi)容。

87ae0bd4-8fb7-11ec-952b-dac502259ad0.png

FocusTrapArea

FocusTrapArea大家可能會比較陌生,這個是最近的版本里才出現(xiàn)的控件,FocusTrapArea本身并沒有特別,它僅僅是在RenderObject tree里塞進去了一個FocusNode。 它的出現(xiàn)主要是為了 Web/Desktop 平臺,通過增加了FocusTrapArea之后,在 Web/Desktop 平臺執(zhí)行TextEditingController.clear的時候,TextField 還能繼續(xù)保持之前獲得的焦點。

具體可見Flutter的issues:#86154、#86041

MouseRegion

顧名思義是用于處理鼠標(biāo)相關(guān)事件,主要用于響應(yīng)鼠標(biāo)獨占的 Pointer 事件,比如:鼠標(biāo)進入/離開控件區(qū)域、光標(biāo)顯示效果等等。

IgnorePointer

它在TextField里主要用于處理當(dāng)前輸入框是否可用的的狀態(tài),比如當(dāng)widget.enabled或者widget.decoration?.enabledfalse時,IgnorePointer就會屏蔽整個區(qū)域內(nèi)的手勢事件,從而讓TextField會無法點擊輸入。

TextSelectionGestureDetectorBuilder

關(guān)于TextSelectionGestureDetectorBuilder大家應(yīng)該比較少接觸,而在TextField里使用的是它的子類_TextFieldSelectionGestureDetectorBuilder:

它主要是處理TextField內(nèi)針對EditableText的點擊、滑動、長按等事件,例如單擊彈起鍵盤,長按彈出選擇復(fù)制/粘貼框等等。

TextSelectionGestureDetectorBuilder 的內(nèi)部主要是通過 editableTextKey 這個 GlobalKey 去獲取到 EditableTextState,從而將各種手勢事件和 EditableText 里的行為關(guān)聯(lián)起來。

該控件內(nèi)部使用的是TextSelectionGestureDetector。

例如在 _TextFieldSelectionGestureDetectorBuilder 中,可以看到 onSingleTapUp 的處理流程:

87e0efc2-8fb7-11ec-952b-dac502259ad0.png

如上代碼所示:

1、收起已經(jīng)彈出的 Toolbar (一個 Overlay,也就是復(fù)制/粘貼之類的彈框);2、根據(jù)不同平臺選擇響應(yīng)事件;3、執(zhí)行彈出鍵盤操作;4、回調(diào)點擊事件。
所以可以看到,這里其實是先執(zhí)行彈出鍵盤,然后再回調(diào)點擊的 callback,所以如果您需要在點擊彈出鍵盤前,針對 TextField 作一些處理,那么 TextFieldonTap 其實并不合適,因為它是已經(jīng)彈出了。 最后 _TextFieldSelectionGestureDetectorBuilder 會調(diào)用 buildGestureDetector 方法生成一個監(jiān)聽和處理觸摸的控件,用于嵌套 child。

???????????InputDecorator???????????

關(guān)于 InputDecorator 的內(nèi)部參數(shù)解析這里就不多說,以前在書里已經(jīng)有詳細介紹過,用過 TextField 的大家對于 InputDecorator 應(yīng)該也不會陌生,TextFieldInputDecorator 的實現(xiàn)是和 AnimatedBuilder 一起組成使用。

因為在 TextFieldFocusNodeTextEditingController 都是 ChangeNotifier (Listenable),所以它們可以被用于 AnimatedBuilderanimation。

87f0d0a4-8fb7-11ec-952b-dac502259ad0.png

也就是當(dāng) FocusNodeTextEditingController 這兩者發(fā)生改變的時候,會讓 InputDecorator 重新 rebuild 從而改變渲染效果,例如: 輸入框輸入內(nèi)容時、焦點發(fā)生改變時修改輸入框的背景顏色。

注意別搞混了InputDecoratorInputDecoration,InputDecoration 是用來配置InputDecorator

所以可以看到InputDecorator有很豐富的參數(shù)和配置,開發(fā)者可以通過InputDecoration來配置很豐富的輸入框 UI 效果,但是如果剛好出現(xiàn)某些位置,或者某些縫隙不滿足產(chǎn)品詭異的需求時,那恭喜您,您開啟了 Flutter 高級開發(fā)的修煉之路。

為什么呢? 簡單來說 InputDecorator 的實現(xiàn)是在內(nèi)部是一個自定義的 RenderBox,其中和 layout 相關(guān)部分就有 600 多行的代碼,也就是根據(jù) InputDecorationiconprefixIcon、suffix 等參數(shù),進行定位布局,計算位置方向,根據(jù)基線調(diào)整位置等等。

另外 InputDecorator里的動畫效果主要是通過內(nèi)部的AnimatedOpacity等完成。

所以對于 InputDecorator 來說,如果您對于某些位置或者邊界效果不滿意,要么您就重構(gòu)一個自己的實現(xiàn),要么可能就要選擇 "委曲求全"。

RepaintBoundary

為什么 TextField 內(nèi)部會有一個 RepaintBoundary?首先 RepaintBoundary 是干嘛的?

之前在《Flutter 畫面渲染的全面解析》詳細介紹過這部分的知識,這簡單不嚴(yán)謹(jǐn)?shù)卣f就是:RepaintBoundary 主要是用于形成一個 Layer,得到一個獨立的繪制區(qū)域。

常見的就是 Navigator 的頁面跳轉(zhuǎn),內(nèi)部基礎(chǔ)實現(xiàn)都有一個 RepaintBoundary 來保證每個區(qū)域都是獨立的繪制區(qū)域。

另外說到Navigator 就不得不說每個頁面也都有自己的FocusScope,也就是我們常用的FocusScope.of(context)等用于鍵盤和焦點處理。
TextField 內(nèi)部有一個 RepaintBoundary,是因為 TextField 本身是一個需要頻繁更新的控件,而 TextField 里的內(nèi)容變化一般很少需要觸發(fā)父布局的重繪,所以 RepaintBoundary 的存在讓 TextField 可以實現(xiàn)性能更好的局部繪制。

UnmanagedRestorationScope

UnmanagedRestorationScope 大家可能比較少用到,它本身是一個 InheritedWidget,主要是往下共享一個 RestorationBucket,RestorationBucket 主要是和實現(xiàn)狀態(tài)的保存/恢復(fù)有關(guān)系。

例如應(yīng)用因為低內(nèi)存在后臺被回收時,可以通過它在重新回到 App 時恢復(fù)指定的數(shù)據(jù),舉個例子:

import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {  @override  Widget build(BuildContext context) {    return MaterialApp(      // Give your RootRestorationScope an id, defaults to null.      restorationScopeId: 'root',       home: HomePage(),    );  }}
class HomePage extends StatefulWidget {  @override  _HomePageState createState() => _HomePageState();}
// Our state should be mixed-in with RestorationMixinclass _HomePageState extends State<HomePage> with RestorationMixin {
  // For each state, we need to use a restorable property  final RestorableInt _index = RestorableInt(0);
  @override  Widget build(BuildContext context) {    return Scaffold(      body: Center(child: Text('Index is ${_index.value}')),      bottomNavigationBar: BottomNavigationBar(        currentIndex: _index.value,        onTap: (i) => setState(() => _index.value = i),        items: [          BottomNavigationBarItem(              icon: Icon(Icons.home),              label: 'Home'          ),          BottomNavigationBarItem(              icon: Icon(Icons.notifications),              label: 'Notifications'          ),          BottomNavigationBarItem(              icon: Icon(Icons.settings),              label: 'Settings'          ),        ],      ),    );  }
  @override  // The restoration bucket id for this page,  // let's give it the name of our page!  String get restorationId => 'home_page';
  @override  void restoreState(RestorationBucket? oldBucket, bool initialRestore) {    // Register our property to be saved every time it changes,    // and to be restored every time our app is killed by the OS!    registerForRestoration(_index, 'nav_bar_index');  }}

如上代碼所示:

  • 首先給 MaterialApp 配置 restorationScopeId (必須配置才算開啟該功能)。

  • 使用 RestorableInt 用于配置和保存 BottomNavigationBarindex;

  • State 混入 RestorationMixin 并且在 restoreState 方法里恢復(fù) index 的狀態(tài);

其中默認(rèn) MaterialApp 內(nèi)部用到了 RootRestorationScope,而 RootRestorationScope的內(nèi)部就是 UnmanagedRestorationScope;上述例子運行后通過打開模擬器開發(fā)者設(shè)置里的 Don't keep activities 就可以看到效果。

以上示例來自《Introduction to State Restoration in Flutter》。

回到 TextField,在 _TextFieldState 里就混入了 RestorationMixin,然后使用 RestorableTextEditingController 用于用于恢復(fù) TextEditingController。

因為輸入框的內(nèi)容默認(rèn)保存在了TextEditingControllerTextEditingValue里,所以這里用的是RestorableTextEditingController。

88186dd0-8fb7-11ec-952b-dac502259ad0.png

一般情況下是使用 MaterialApp 內(nèi)部默認(rèn)自帶了一個 RootRestorationScope,所以我們只需要給 MaterialApp 設(shè)置 restorationScopeId,TextFild 通過內(nèi)置 UnmanagedRestorationScope 相關(guān)的邏輯,最終實現(xiàn)了文本內(nèi)容的保存與恢復(fù)。

EditableText

EditableText 就不用多說了,TextField 的本體,內(nèi)部主要通過 Scrollable 來實現(xiàn)滑動,同樣的它也用了對應(yīng)的 restorationId 來實現(xiàn)恢復(fù)和緩存。

首先注意到可以滑動這一點,可以看到對于 EditableText 來說,它其實是一個 "ViewPort",是根據(jù) ViewportOffset 來實現(xiàn)滑動效果。

而對于 EditableText 內(nèi)部,它使用了 CompositedTransformTarget 來實現(xiàn) Toolbar 和輸入框的聯(lián)動,也就是輸入控件和長按 "粘貼/復(fù)制" 彈出框之間的關(guān)聯(lián)。

所以這里簡單介紹下 CompositedTransformTarget,它通常和 CompositedTransformFollower 一起被用于控件之間的聯(lián)動效果。

如上圖所示,常見內(nèi)置的 Slider,在滑動的彈出部分實現(xiàn),就是通過 CompositedTransformTargetCompositedTransformFollower 的結(jié)合實現(xiàn),它可以讓一個控件跟隨另外一個控件而無需計算位置,它們之間主要是通過 LayerLink 鏈接在一起。 回到 TextField,其實除了 "復(fù)制/粘貼"的 Toolbar,關(guān)于 selection 選中區(qū)域的內(nèi)容,EditableText 內(nèi)部也是通過類似的方式實現(xiàn),只是這里是直接通過 LeaderLayer 而不是通過它的封裝 CompositedTransformTarget 去實現(xiàn)。

當(dāng)然使用 CompositedTransformTarget 還是會有 "比較大" 的性能開銷,不建議大規(guī)模頻繁使用,因為畢竟它屬于一個 pushLayer 的操作。

另外 EditableText 內(nèi)部繪制內(nèi)容的部分,主要就是大家都知道的 TextPainter,這部分就沒什么特別,暫時不詳細展開。

所以本篇主要是通過介紹 TextField 的組成,以及解釋內(nèi)部各組成部分的作用,讓開發(fā)者可以更清晰的了解 Flutter 里常用的文本輸入框的實現(xiàn),當(dāng)遇上問題或者需求時,可以快速定位和解決問題,例如:

  • "粘貼/復(fù)制"的 Toolbar 是哪里彈出;

  • Toolbar 是如何定位和布局;
  • 點擊 TextField 是如何彈出鍵盤和處理手勢事件;
  • TextField 如何做到局部繪制;
  • ...

最后介紹一個簡單的問題,之前有人剛好問我: 如何在 Flutter 上實現(xiàn)類似微信聊天輸入框從一行到多行的輸入框效果,如下圖代碼所示,就是這么簡單:

TextField(  focusNode: _focusNode,  maxLines: 7,  minLines: 1,  decoration:      const InputDecoration(border: OutlineInputBorder()),)

原文標(biāo)題:Flutter 快速解析 TextField 的內(nèi)部原理 | 開發(fā)者說·DTalk

文章出處:【微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 顯示
    +關(guān)注

    關(guān)注

    1

    文章

    479

    瀏覽量

    46219
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1870

    瀏覽量

    34047
  • 模擬器
    +關(guān)注

    關(guān)注

    2

    文章

    1026

    瀏覽量

    45869

原文標(biāo)題:Flutter 快速解析 TextField 的內(nèi)部原理 | 開發(fā)者說·DTalk

文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    ESD門禁系統(tǒng)主要構(gòu)成部分有哪些

     ESD門禁系統(tǒng)由靜電綜合測試模塊、機芯、閘機、識別模塊、閘機控制模塊、管理軟件等構(gòu)成?! ?、靜電綜合測試模塊。根據(jù)國家相關(guān)標(biāo)準(zhǔn)對穿著防靜電鞋的腳部和戴著防靜電腕帶的手部分別同時進行靜電檢測,只有
    發(fā)表于 11-18 09:59

    擠出中空成型機的主要構(gòu)成部分

    `擠出中空成型機主要構(gòu)成部分,分為四部分,分別是機械、電氣、液壓、氣路、水路。巖康小編將分別根據(jù)擠出中空成型機的幾個主要
    發(fā)表于 07-13 16:20

    ISP的主要內(nèi)部構(gòu)成

    目錄ISP的主要內(nèi)部構(gòu)成:ISP內(nèi)部包含 CPU、SUP IP(各種功能模塊的通稱)、IF 等設(shè)備ISP的控制結(jié)構(gòu):1、ISP邏輯 2、運行在其上的firmwareISP上的Firmware包含三部分:AP對ISP的操控方式:外
    發(fā)表于 07-26 06:42

    Etest_CPS系統(tǒng)主要由哪些部分構(gòu)成

    設(shè)備組成Etest_CPS系統(tǒng)主要由硬件部分與軟件部分組成。硬件部分由PCI機箱、PCI控制器以及各種PCI接口板卡組成。軟件部分由測試設(shè)計
    發(fā)表于 09-08 07:05

    構(gòu)成微機系統(tǒng)CPU的兩部分是什么

    2008年(下)高等教育自學(xué)考試全國統(tǒng)一命題考試工業(yè)用微型計算機試卷及答案詳解(考試時間150分鐘)第一部分選擇題一、單項選擇題(本大題共20小題,每小題2分,共40分)在每小題列出的四個備選項中
    發(fā)表于 09-10 07:54

    HarmonyOS實戰(zhàn)——TextField文本輸入框組件基本使用

    【鴻蒙專欄,從入門到實戰(zhàn)系列】:https://bbs.elecfans.com/user/4697363/posts/1. TextField組件基本用法組件說明:是Text的子類,用來進行用戶
    發(fā)表于 09-27 16:26

    ZVIT光伏玻璃原片表面在線檢測系統(tǒng)主要由哪幾個部分構(gòu)成

    光伏玻璃原片表面在線檢測系統(tǒng)工作原理是什么?ZVIT光伏玻璃原片表面在線檢測系統(tǒng)主要由哪幾個部分構(gòu)成
    發(fā)表于 10-22 06:07

    STM32最小系統(tǒng)主要是由哪些部分構(gòu)成

    STM32最小系統(tǒng)主要是由哪些部分構(gòu)成的?有沒有哪位大神分享一下啊
    發(fā)表于 11-23 07:34

    單片機主要由哪幾部分構(gòu)成

    單片機主要由運算器、控制器和寄存器三大部分構(gòu)成。其中,運算器由算術(shù)邏輯單元(ALU)、累加器、寄存器等構(gòu)成,首先累加器和寄存器向ALU輸入兩個8位源數(shù)據(jù),其次ALU完成源數(shù)據(jù)的邏輯運算
    發(fā)表于 12-01 06:18

    NodeMCU+Influxdb+Grafana主要由哪幾部分構(gòu)成

    電力計量——NodeMCU+Influxdb+Grafana主要由一下幾個部分構(gòu)成:-數(shù)據(jù)庫:Influxdb——開源的時序數(shù)據(jù)庫 -前端:Grafana——開源的圖表展示 -數(shù)據(jù)采集
    發(fā)表于 02-16 06:42

    TextField組件的相關(guān)資料分享【使用方法+案例】

    目錄  1.TextField組件基本用法  2. 獲取文本輸入提示的內(nèi)容并進行Toast  3.TextField組件高級使用  3.1 密碼的密文展示  3.2 收藏的設(shè)置  3.3 氣泡的設(shè)置
    發(fā)表于 03-29 14:56

    HarmonyOS系統(tǒng)TextField組件基本用法

    1. TextField組件基本用法 組件說明: 是Text的子類,用來進行用戶輸入數(shù)據(jù)的 常見屬性: 《TextField ohos:id=“$+id:text” ohos:height
    的頭像 發(fā)表于 10-09 09:18 ?2480次閱讀
    HarmonyOS系統(tǒng)<b class='flag-5'>TextField</b>組件基本用法

    TextField被填充提示將標(biāo)簽浮現(xiàn)在上方

    項目介紹: 項目名稱:floatlabelededittext 所屬系列:openharmony的第三方組件適配移植 功能:使用一個子TextField,當(dāng)TextField被填充時,提示將浮現(xiàn)
    發(fā)表于 03-18 15:10 ?1次下載
    <b class='flag-5'>TextField</b>被填充提示將標(biāo)簽浮現(xiàn)在上方

    mes系統(tǒng)軟件主要構(gòu)成部分是什么?

    mes系統(tǒng)是一個可自定義的制造管理系統(tǒng),不同企業(yè)的生產(chǎn)流程和業(yè)務(wù)需求可以通過現(xiàn)場定位實現(xiàn)。本篇文章我們主要跟著通商軟件一起來了解一下關(guān)于mes系統(tǒng)軟件的主要組成部分,方便企業(yè)在應(yīng)用mes系統(tǒng)軟件之前能有一個明確的認(rèn)知。
    的頭像 發(fā)表于 04-17 10:13 ?1684次閱讀

    pcb線路板主要部分組成

      一站式PCBA智造廠家今天為大家講講pcb由哪些部分組成成型?pcb線路板的構(gòu)成部分及作用。PCB是由各種不同的層組成的,不同的層有不同的用途和意義,為方便大家更好的理解PCB的組成,接下來為大家
    的頭像 發(fā)表于 05-17 09:46 ?5666次閱讀
    阿克苏市| 丰原市| 铁岭县| 贵州省| 罗田县| 临漳县| 廉江市| 山阴县| 北海市| 麻城市| 德格县| 裕民县| 苍南县| 沁阳市| 什邡市| 西宁市| 广河县| 根河市| 遂平县| 托克逊县| 甘孜| 桑植县| 香格里拉县| 宜兴市| 嫩江县| 长乐市| 榆中县| 曲周县| 苏尼特右旗| 博野县| 城步| 柏乡县| 顺义区| 昔阳县| 农安县| 韶关市| 肇州县| 东山县| 新建县| 揭西县| 渭南市|