chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

Flutter 3.3 之 SelectionArea 好不好用?用 "Bug" 帶您全面了解它 | 開發(fā)者說·DTalk

谷歌開發(fā)者 ? 來源:未知 ? 2022-11-10 11:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


本文原作者: 戀貓de小郭,原文發(fā)布于:GSYTech


隨著 Flutter 3.3 正式版發(fā)布,Global Selection 終于有了官方的正式支持,「該功能補(bǔ)全了 Flutter 長時(shí)間存在 Selection 異常等問題,特別是在 Flutter Web 下經(jīng)常會有選擇文本時(shí)與預(yù)期的行為不匹配的情況」



使用


「使用 SelectionArea 也十分簡單,如下代碼所示,只需要在您想要支持的地方添加 SelectionArea 即可」,甚至可以在每個(gè)路由下的Scaffold 添加SelectionArea 來全面啟用支持。

默認(rèn)情況下SelectionArea 已經(jīng)實(shí)現(xiàn)了所有常見的功能,并且 Flutter 針對不同平臺進(jìn)行了差異化實(shí)現(xiàn),如下圖所示 AndroidiOS 會有不同的樣式效果。





「當(dāng)然,也許這時(shí)候您會發(fā)現(xiàn)在 iOS 上的 Toolbar 居然沒有全選」,其實(shí)這是因?yàn)?iOS 使用了 TextSelectionControls 默認(rèn)的 canSelectAll 判斷,這個(gè)判斷里有一個(gè)條件就是需要 selection 的 start == end 才符合條件。

所以如果您覺得這個(gè)判斷有問題,完全可以自己 override 一個(gè)自定義的 TextSelectionControls,比如在canSelectAll 直接 return true。





是的,「對于SelectionArea 我們可以通過繼承 TextSelectionControls 來自定義」:

  • 通過 buildToolbar 自定義彈出的 Toolbar 樣式和邏輯,甚至您可以添加一些額外的標(biāo)簽能力,比如 "插入圖片";
  • 通過 buildHandle 自定義 Selection Handle 可拖動部分的樣式。

而在SelectionArea 里,不管是 Handle 還是 Toolbar,都是通過新增 Overlay 來實(shí)現(xiàn)樣式,這部分的邏輯主要在 SelectionOverlay 對象:






如果您還不了解Overlay,可以簡單理解為:「默認(rèn)情況下所有的路由頁面都在一個(gè) Overlay 下,打開一個(gè) Route 就是添加一個(gè) OverlayEntryOverlay 里」。

所以 Handle 和 Toolbar 都是通過OverlayEntry 打開的特殊 "路由" 控件,擁有新的層級,例如下方右圖就是 Toolbar 所在的OverlayEntry。







「另外,對于 Handle 的顏色定義,默認(rèn)情況下主要來自 TextSelectionThemeTheme


例如MaterialTextSelectionControls 里,start 和 end 兩個(gè) Handle 的顏色,默認(rèn)是通過 TextSelectionThemeselectionHandleColor 或者Themeprimary 來設(shè)置。

那文字的選中區(qū)域的顏色是怎么來的?難道也是 OverlayEntry 嗎?

答案是否定的,這部分顏色主要是來自于文本繪制時(shí) Canvas 的渲染。

如下代碼所示,「當(dāng)文本被繪制時(shí),會判斷當(dāng)前是否有被選中的片段,如果存在選中的片段,會調(diào)用繪制對應(yīng)的選中圖層」。

而對于文字的選中區(qū)塊的顏色,默認(rèn)是通過 DefaultSelectionStyleselectionColor 來顯示,當(dāng)然,如下第二張圖所示,在 MaterialApp 里它依然和 TextSelectionThemeselectionColor 或者Themeprimary 有關(guān)系。

「那如果您還想要在SelectionArea 下的某些內(nèi)容不允許被選中呢」?


這里 Flutter 提供了 SelectionContainer.disabled 實(shí)現(xiàn),只要在對應(yīng)內(nèi)容嵌套 SelectionContainer.disabled,那么這部分內(nèi)容下的文本就無法被選中。



為什么嵌套SelectionContainer.disabled 就可以禁用文本選中的能力?這其實(shí)和SelectionArea 的實(shí)現(xiàn)有關(guān)系:


SelectionContainer 內(nèi)部實(shí)現(xiàn)了一個(gè) InheritedWidget,它會往下共享一個(gè) SelectionRegistrar,而默認(rèn)情況下SelectionArea 內(nèi)部使用了SelectionContainer 并且往下共享了對應(yīng)的 Registrar 實(shí)現(xiàn)。


  • SelectionArea 內(nèi)部的 SelectionContainer 是有對應(yīng)的 registrar 實(shí)現(xiàn)往下共享;
  • SelectionContainer.disabled 內(nèi)部的registrarnull。

「所以根本區(qū)別就在于 SelectionContainer.disabled 里沒有 registrar,如下圖一所示,加了 disabled 后獲取到的 registrar 是 null,那么如下圖二代碼所示,在后續(xù)可選中區(qū)域的更新邏輯中就會直接 return。
△ 圖一

圖二

到這里您應(yīng)該大致理解了如何使用和自定義一些 SelectionArea 的能力,那么接下來介紹兩個(gè) "Bug",通過這兩個(gè) "Bug" 我們深入理解SelectionArea 內(nèi)部的實(shí)現(xiàn)情況。



問題 1


如下代碼所示,「當(dāng)使用了WidgetSpan 之后,默認(rèn)情況下,用戶在開始位置拖拽 Handle 進(jìn)行選擇時(shí)會無法選中WidgetSpan 里的文本」。





PS:其實(shí)拖動可以選中,只是這里暫時(shí)以不能選中的情況下作為切入點(diǎn)。


為什么會這樣?首先要知道,上面代碼在使用了WidgetSpan 包裹 Hello World 之后,其實(shí)是存在兩個(gè) Text,也就是上述的 UI 是由兩個(gè) RenderParagraph 繪制完成。

那么對于最外層的 Text,其實(shí)它的文本內(nèi)容是 "Flutter is the best!",注意這段文本,其實(shí)文本里此時(shí)是多了兩個(gè)空格。
之所以會有這兩個(gè)空格,其實(shí)是因?yàn)?/span>WidgetSpan 使用了 0xFFFC 的占位符,這段占位符在渲染時(shí),就會被替換為WidgetSpan 對應(yīng)的 Hello World 和貓頭圖片。

「那么這時(shí)候如果我們選擇復(fù)制,復(fù)制出來的內(nèi)容會是 Flutter isthe best!,中間的兩個(gè)占位符是不會復(fù)制出來,因?yàn)樵讷@取可選擇片段時(shí),會把對應(yīng)的 placeholderCodeUnit 剔除。

另外,當(dāng)我們點(diǎn)擊復(fù)制的時(shí)候,WidgetSpan 所在的Hello World 并沒有被選中,所以此時(shí)調(diào)用 getSelectedContent 就會得到 null,也就是沒有內(nèi)容。
所以可以看到: 此時(shí)在手動拖拽選擇時(shí),WidgetSpan 里的文本是不會被選中,因?yàn)樗幱诓煌?Text,對于外層 Text 而言它只是個(gè)占位符。


當(dāng)然,「其實(shí)在拖動Handle還是可以選中WidgetSpan里的文本,比如您從HelloWorld開始拖動,這里拖動選中不了的原因后面會解釋」


問題2


如果當(dāng)我們點(diǎn)擊了全選會怎么樣?如下圖所示,在我們點(diǎn)擊全選之后,可以看到兩個(gè) "奇怪" 的問題:

  • WidgetSpan 里的 Hello World 可以被選中了;
  • 左側(cè)的 Start Handle 位置不是在文本開頭,而是在WidgetSpan 開始。

我們首先看第一點(diǎn),「為什么點(diǎn)擊全選時(shí),WidgetSpan 里的 Hello World 可以被選中」?


其實(shí)全選操作和拖拽 Handle 最大的不同就是: 它是往下直接發(fā)出全選事件 SelectAllSelectionEvent,而該事件會觸發(fā)所有 child 響應(yīng)事件,自然也就包括了 WidgetSpan 里的 Hello World

最后負(fù)責(zé)響應(yīng) SelectAll 事件的對象是 _SelectableFragment,這里主要有兩個(gè)關(guān)鍵邏輯:
  • _handleSelectAll 獲取得到 _textSelectionStart_textSelectionEnd,表明此時(shí)控件已經(jīng)被選中;
  • didChangeSelection 里通過 paragraph.markNeedsPaint() 觸發(fā)重繪,然后增加選中時(shí)的覆蓋顏色。
可以看到,由于此時(shí) WidgetSpan 里的 Hello World 也直接響應(yīng)了全選事件,所以它會處于選中狀態(tài),這樣之后在 getSelectedContent 調(diào)用里也可以獲取到內(nèi)容,也就是Hello World 能被復(fù)制出來。
**但是此時(shí)復(fù)制出來的內(nèi)容會是 Hello World!Flutter isthe best! **,是不是感覺還不對?這就是我們要說的第二個(gè)問題,左側(cè)的 Start Handle 位置不是在文本開頭。

首先我們看,為什么復(fù)制出來之后的內(nèi)容會是Hello World!Flutter isthe best!?


正如前面說到的,復(fù)制調(diào)用的是 getSelectedContent 方法,如下代碼所示,「可以看到在selectables 這個(gè) List 的第一位就是Hello World,所以最終拼接出來的文本會是Hello World!Flutter isthe best! 。

那為什么 Hello World 會排在 selectables 的第一位?這就需要講到 Flutter 里對 Selectable 的一個(gè)排序邏輯。

我們知道 Text 內(nèi)部是通過 RenderParagraph 實(shí)現(xiàn)文本繪制,而RenderParagraph 在初始化的時(shí)候,「如果存在 _registrar,也就是存在SelectionArea 的時(shí)候,就會通過 add 把支持選中的片段添加 SelectionArea 內(nèi)部的 _additions里。
之后 SelectionArea 內(nèi)部會對可選中的內(nèi)容進(jìn)行排序,如下代碼所示,在 sort 之前,此時(shí)的 Hello World_additions 列表的最末端,因?yàn)樗幱?WidgetSpan 的 child 里,所以是最晚被加入到 _additions 的。
而在執(zhí)行完 sort 之后,可以看到此時(shí) Hello World 跑到了列表的最前面,「這也是為什么復(fù)制出來的內(nèi)容順序是Hello World 開頭,然后 Start Handle 會顯示在Hello World 的原因」。
sort 的邏輯主要是通過compareOrder 實(shí)現(xiàn),簡單分析 compareOrder 的排序?qū)崿F(xiàn),可以看到其中有一個(gè) _compareVertically 的邏輯,通過調(diào)試對比,「可以看到此時(shí)因?yàn)?/strong>Hello World 所處的 Rect (top) 比其他文本高,所以它被認(rèn)為是更高優(yōu)先級的位置,類似于被誤認(rèn)為是上一行的情況」
知道了問題那就很好處理了,「如下代碼所示,如果此時(shí)調(diào)整一下 WidgetSpan 的高度,可以看到全選邏輯下 Start Handle 正常了,但是.... End Handle 位置又不對了」。





此時(shí)復(fù)制出來的內(nèi)容會是 Flutter isthe best!Hello World!「因?yàn)檫@個(gè)時(shí)候會有一個(gè)很 "微妙" 的偏差值,導(dǎo)致 Hello World 排序時(shí)被排列到最后面」,從而導(dǎo)致 End Handle 不是預(yù)期的位置。
另外,這時(shí)候您會發(fā)現(xiàn),如下左側(cè)動圖所示,「此時(shí)拖動 Handle 是可以選中 WidgetSpan 里的 Hello World,其實(shí)之前的情況下也可以,不過需要如右側(cè)動圖所示,需要從Hello World 開始拖動,「因?yàn)樽铋_始的情況下 selectablesHello World 的排序?qū)蛹壐?,所以如果想要拖動選中,也需要從它開始」





目前這個(gè)問題在 master 和 stable 分支均可以復(fù)現(xiàn),對應(yīng) issue 我也提交在#111021。


最后


雖然SelectionArea 的出現(xiàn)補(bǔ)全了 Flutter 的長久以來的短板之一,不過基于SelectionArea 實(shí)現(xiàn)的復(fù)雜程度,目前SelectionArea 還有不少的細(xì)節(jié)需要優(yōu)化,但是萬事開頭難,本次 3.3 SelectionArea 的落地也算是一個(gè)不錯(cuò)的開始。


最后,相信通過本文大家應(yīng)該對 SelectionArea 的使用和實(shí)現(xiàn)都有了一定的了解。



長按右側(cè)二維碼

查看更多開發(fā)者精彩分享




"開發(fā)者說·DTalk" 面向中國開發(fā)者們征集 Google 移動應(yīng)用 (apps & games)?相關(guān)的產(chǎn)品/技術(shù)內(nèi)容。歡迎大家前來分享您對移動應(yīng)用的行業(yè)洞察或見解、移動開發(fā)過程中的心得或新發(fā)現(xiàn)、以及應(yīng)用出海的實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié)和相關(guān)產(chǎn)品的使用反饋等。我們由衷地希望可以給這些出眾的中國開發(fā)者們提供更好展現(xiàn)自己、充分發(fā)揮自己特長的平臺。我們將通過大家的技術(shù)內(nèi)容著重選出優(yōu)秀案例進(jìn)行谷歌開發(fā)技術(shù)專家 (GDE)的推薦。



?點(diǎn)擊屏末||即刻報(bào)名參與"開發(fā)者說·DTalk"





原文標(biāo)題:Flutter 3.3 之 SelectionArea 好不好用?用 "Bug" 帶您全面了解它 | 開發(fā)者說·DTalk

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

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

    關(guān)注

    27

    文章

    6244

    瀏覽量

    110263

原文標(biāo)題:Flutter 3.3 之 SelectionArea 好不好用?用 "Bug" 帶您全面了解它 | 開發(fā)者說·DTalk

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    Flutter 移動端開發(fā):集成淘寶 API 實(shí)現(xiàn)商品數(shù)據(jù)實(shí)時(shí)展示 APP

    在電商蓬勃發(fā)展的當(dāng)下,移動端購物成為主流趨勢。對于開發(fā)者而言,利用 Flutter 構(gòu)建一個(gè)能夠?qū)崟r(shí)展示淘寶商品數(shù)據(jù)的 APP,既能滿足用戶便捷獲取商品信息的需求,也能為電商業(yè)務(wù)拓展新的渠道
    的頭像 發(fā)表于 11-13 09:36 ?162次閱讀

    元服務(wù)發(fā)布配置開發(fā)者服務(wù)信息

    作為開發(fā)者的相關(guān)信息將面向元服務(wù)發(fā)布區(qū)域的用戶公開,其中客服聯(lián)系方式可能會提供給用戶,用于咨詢相關(guān)問題。 登錄AppGallery Connect,點(diǎn)擊“APP與元服務(wù)”。 選擇要發(fā)布的元服務(wù)
    發(fā)表于 10-31 17:58

    電能質(zhì)量在線監(jiān)測裝置在實(shí)際應(yīng)用中如何選擇有線或無線通信技術(shù)?

    電能質(zhì)量在線監(jiān)測裝置選擇有線或無線通信技術(shù),核心是 **“先解決‘能不能用’,再優(yōu)化‘好不好用’”**—— 以 “布線可行性” 為首要前提,再結(jié)合數(shù)據(jù)需求、環(huán)境特征、成本投入三維度綜合判斷,避免單純依賴技術(shù)優(yōu)劣選擇。
    的頭像 發(fā)表于 10-24 18:16 ?1994次閱讀

    Android Studio中的Gemini全面支持Dart和Flutter開發(fā)

    在 Android Studio 中創(chuàng)建 Android 應(yīng)用的 Flutter 開發(fā)者將迎來一次重大的飛躍: Android Studio 中的 Gemini 已全面支持 Dart
    的頭像 發(fā)表于 08-06 13:52 ?1078次閱讀
    Android Studio中的Gemini<b class='flag-5'>全面</b>支持Dart和<b class='flag-5'>Flutter</b><b class='flag-5'>開發(fā)</b>

    迅龍軟件參加昇騰 AI?開發(fā)者創(chuàng)享日?廣東站,為開發(fā)者打造沉浸式實(shí)操體驗(yàn)

    7月18日,線下頂尖人才匯聚的開發(fā)者盛會——昇騰AI開發(fā)者創(chuàng)享日?廣東站在廣州舉行?;顒右浴皠?chuàng)未來享非凡”為主題,聚焦廣東本地產(chǎn)業(yè)特點(diǎn),分享前沿AI創(chuàng)新技術(shù),搭建生態(tài)交流平臺,幫助開發(fā)者全面
    的頭像 發(fā)表于 07-23 17:18 ?1102次閱讀
    迅龍軟件參加昇騰 AI?<b class='flag-5'>開發(fā)者</b>創(chuàng)享日?廣東站,為<b class='flag-5'>開發(fā)者</b>打造沉浸式實(shí)操體驗(yàn)

    華為正式啟動HarmonyOS 6開發(fā)者Beta

    在2025年華為開發(fā)者大會(HDC)上,華為正式啟動HarmonyOS 6開發(fā)者Beta,并全面展示一年多以來與合作伙伴共建鴻蒙生態(tài)的創(chuàng)新成果。
    的頭像 發(fā)表于 06-24 15:42 ?641次閱讀

    Flutter on Raspberry Pi:從入門到精通的完整指南!

    Flutter。通過遵循本文中概述的步驟,你將獲得在樹莓派上設(shè)置Flutter的知識和信心。無論你是初學(xué)者還是經(jīng)驗(yàn)豐富的Flutter開發(fā)者,本指南都將確保你對過程有清晰的
    的頭像 發(fā)表于 06-06 15:37 ?1368次閱讀
    <b class='flag-5'>Flutter</b> on Raspberry Pi:從入門到精通的完整指南!

    阿童木雙張檢測器好不好用?數(shù)據(jù)和場景說話

    在工業(yè)生產(chǎn)中,雙張疊料檢測是保障產(chǎn)線穩(wěn)定與產(chǎn)品質(zhì)量的關(guān)鍵環(huán)節(jié)。阿童木雙張檢測器憑借技術(shù)創(chuàng)新和行業(yè)落地經(jīng)驗(yàn),成為眾多企業(yè)的選擇。但它究竟“好不好用”?本文將從性能表現(xiàn)、場景適配、用戶反饋三大維度展開
    的頭像 發(fā)表于 05-22 11:39 ?614次閱讀
    阿童木雙張檢測器<b class='flag-5'>好不好用</b>?<b class='flag-5'>用</b>數(shù)據(jù)和場景說話

    電子工廠ERP好不好用

    在電子制造業(yè)競爭日益激烈的當(dāng)下,企業(yè)都在尋找提升效率、降低成本的解決方案,而ERP系統(tǒng)成為了眾多企業(yè)的選擇。那么,電子工廠ERP系統(tǒng)到底好不好用呢?本文將從多個(gè)實(shí)際應(yīng)用場景出發(fā),為你揭開答案。一
    的頭像 發(fā)表于 05-12 09:58 ?492次閱讀
    電子工廠ERP<b class='flag-5'>好不好用</b>

    開源mlops平臺好用

    在MLOps平臺的選擇上,開源平臺因其成本效益、靈活性以及社區(qū)支持等優(yōu)勢,受到了越來越多開發(fā)者和企業(yè)的青睞。那么,開源MLOps平臺真的好用嗎?下面,AI部落小編
    的頭像 發(fā)表于 03-05 11:09 ?518次閱讀

    云端AI開發(fā)者工具的核心功能

    當(dāng)今,云端AI開發(fā)者工具已成為推動科技創(chuàng)新與行業(yè)升級的重要力量。那么,云端AI開發(fā)者工具有哪些核心功能呢?下面,AI部落小編深入探討。
    的頭像 發(fā)表于 02-28 11:46 ?870次閱讀

    嵌入式軟件工程師就業(yè)好不好?

    嵌入式軟件工程師就業(yè)好不好?會不會越老越吃香?今天一起來看看。 首先看下市場需求。 隨著物聯(lián)網(wǎng)、人工智能、5G等前沿技術(shù)的快速發(fā)展,嵌入式系統(tǒng)的應(yīng)用領(lǐng)域不斷擴(kuò)大,從智能家居、汽車電子到工業(yè)自動化
    發(fā)表于 02-20 10:19

    國外AI開發(fā)者平臺好用

    當(dāng)今,AI項(xiàng)目的復(fù)雜性和多變性給項(xiàng)目管理帶來了前所未有的挑戰(zhàn)。為了有效應(yīng)對這些挑戰(zhàn),AI項(xiàng)目管理平臺應(yīng)運(yùn)而生。那么,AI項(xiàng)目管理平臺有什么?下面,AI部落小編了解
    的頭像 發(fā)表于 02-19 10:16 ?580次閱讀

    AI開發(fā)平臺如何賦能開發(fā)者

    當(dāng)下,AI開發(fā)平臺通過提供豐富的工具集、優(yōu)化的開發(fā)環(huán)境以及高效的部署能力,極大地降低了AI應(yīng)用的開發(fā)門檻,加速了創(chuàng)新步伐。那么,AI開發(fā)平臺如何賦能
    的頭像 發(fā)表于 01-17 14:47 ?721次閱讀

    嘉楠科技邀相約2024 RT-Thread開發(fā)者大會

    嘉楠科技(Canaan Inc.)(納斯達(dá)克股票代碼:CAN)將于12月21日,攜旗下高性能端側(cè) AIoT 芯片產(chǎn)品及解決方案亮相上海2024 RT-Thread 開發(fā)者大會,全方位展示勘智芯片的具體能力及相關(guān)解決方案,務(wù)求讓更多開發(fā)者在現(xiàn)場可以更深一步
    的頭像 發(fā)表于 12-18 16:25 ?1294次閱讀