FlutterUnit TolyUI | 布局游樂場

FlutterUnit 基于 TolyUI 大大簡化了界面構建的代碼復雜程度,因此之前想要實現的一些小功能,就可以輕松支持。布局游樂場是通過交互的方式來 直觀體驗 組件的布局特性,從而更易學和掌握。目前 FlutterUnit 已在 知識集錄模塊新增了 布局寶庫, 大家可以更新代碼查看 ~


1. 什么是布局游樂場

對于新手朋友,對有些較復雜的布局組件很難把握其特性。為此 FlutterUnit 設立了 布局寶庫 模塊,來幫助開發者更容易理解 Flutter 中的布局特性以及核心的布局組件。其中的 Playground 指的是可交互操作的組件展示面板,如下的 Flex Playground 將淋漓盡致地展示 Flex 組件布局特性。

在這里插入圖片描述

Playground 實現過程中,依賴了很多 TolyUI 中的組件:

  • 對于枚舉類型的參數,通過 TolySelect 組件處理選擇事件。
  • 操作的圖標按鈕使用 TolyAction 組件。
  • 布局寶庫的側欄導航,使用 TolyRailMenuTree 組件。

目前已經完成了 Flex、Wrap、Stack 三個多字布局的 Playground 。可以在操作面板中增加/刪除,指定寬高的色塊。來更好的體驗組件的布局效果。

在這里插入圖片描述


2. Flex Playground 功能實現 - 數據層

下面以 Flex Playground 來介紹一下功能實現。一個 Playground 主要包括兩個區域:左側的組件 效果展示區 和右側的 操作面板區。其中右側的交互操作會影響左側的效果展示:

image.png

我們知道 Flutter 中,數據決定界面的表現,首先應該確定 Flex Playground 中依賴了哪些數據。當前功能是通過交互修改 Flex 組件的屬性,所以 Flex 組件的屬性內容是一份需要維護的狀態。通過下面的 FlexAttr 類承載各個屬性數據:

class FlexAttr {final Axis direction;final MainAxisAlignment mainAxisAlignment;final CrossAxisAlignment crossAxisAlignment;final MainAxisSize mainAxisSize;final TextDirection textDirection;final VerticalDirection verticalDirection;final TextBaseline textBaseline;

另外,需要若干個色塊,它們有各自的寬度和高度,通過 DisplayItem 類承載相關數據:

class DisplayItem {final double width;final double height;final Color color;

這樣 Flex Playground 中的狀態數據就呼之欲出了:

  • [1] . DisplayItem 列表數據,記錄色塊信息。
  • [2]. _selectIndex 選中的色塊索引,用于刪除色塊。
  • [3]. FlexAttr 數據,決定 Flex 組件的展示效果。
class _FlexPlaygroundState extends State<FlexPlayground> {List<DisplayItem> _data = [];late FlexAttr _attr;int _selectIndex = -1;

3. Flex Playground 功能實現 - 視圖層

左側的布局效果展示區封裝為如下的 FlexDisplay 組件,依賴三個狀態數據,通過 Flex 組件來構建展示內容。其中,

  • Flex 構造函數中的各個屬性由 FlexAttr 數據提供;
  • children 組件由 List<DisplayItem> 數據映射得到;
  • 色塊的選中事件,通過 onSelectChanged 回調,交由使用者處理,更新激活索引。

image.png

class FlexDisplay extends StatelessWidget {final List<DisplayItem> items;final FlexAttr attr;final int selectIndex;final ValueChanged<int> onSelectChanged;const FlexDisplay({super.key,required this.items,required this.attr,required this.selectIndex,required this.onSelectChanged,});Widget build(BuildContext context) {return Flex(direction: attr.direction,mainAxisAlignment: attr.mainAxisAlignment,crossAxisAlignment: attr.crossAxisAlignment,mainAxisSize: attr.mainAxisSize,textDirection: attr.textDirection,verticalDirection: attr.verticalDirection,textBaseline: TextBaseline.alphabetic,children: items.asMap().keys.map((int index) {bool active = selectIndex == index;return GestureDetector(onTap: () => onSelectChanged(index),child: DisplayPlayItem(item: items[index], selected: active),);}).toList(),);}
}

右側的操作面板需要支持交互操作,通過觸發事件來更新狀態數據,然后更新界面,即可實現我們期望的功能。Flex 組件的屬性中有很多枚舉值,這比較適合使用下拉選擇來處理。Flutter 中自帶的選擇器在桌面端的體驗效果并不是很好,于是 TolyUI 中提供了 TolySelect 組件,便于構建類似的選擇功能:

image.png

右側的面板通過 FlexOpTool 組件展示,其中添加、刪除、重置的按鈕事件,分別通過回調交由使用者處理。另外屬性操作時數據的變化,也會通過 ValueChanged 通知外界進行數據處理。也就是說 FlexOpTool 本身并不參與狀態數據的維護邏輯。只負責基于數據構建界面,以及數據變化時的回調通知:

class FlexOpTool extends StatefulWidget {final ValueChanged<Size> onAddBox;final VoidCallback onDelete;final VoidCallback onReset;final FlexAttr attr;final ValueChanged<FlexAttr> onAttrChange;

這里著重介紹一下選擇器的使用, TolySelect 主要通過 String 列表 data 和激活索引 selectIndex 決定菜單項羽和激活項;通過 cellStyle 可以簡單定制菜單項的展示效果。由于這里選擇器的使用場合非常多,所以封裝了 ItemSelector 組件統一處理標題、布局等效果:

image.png

typedef NameCalc<T> = String Function(T data);class ItemSelector<T> extends StatelessWidget {final int selectIndex;final List<T> data;final NameCalc<T> calcFun;final ValueChanged<T> onSelect;final String label;final String subTitle;const ItemSelector({super.key,required this.selectIndex,required this.data,required this.calcFun,required this.onSelect,required this.subTitle,required this.label,});Widget build(BuildContext context) {TextStyle labelStyle = const TextStyle(color: Color(0xff61666d), fontSize: 12);DropMenuCellStyle lightStyle = const DropMenuCellStyle(padding: EdgeInsets.symmetric(horizontal: 4,vertical: 1),borderRadius: BorderRadius.all(Radius.circular(6)),foregroundColor: Color(0xff1f1f1f),backgroundColor: Colors.transparent,disableColor: Color(0xffbfbfbf),hoverBackgroundColor: Color(0xfff5f5f5),hoverForegroundColor: Color(0xff1f1f1f),textStyle: TextStyle(fontSize: 11));return Padding(padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 6),child: Row(children: [Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Text(label, style: labelStyle),Text(subTitle, style: labelStyle.copyWith(fontSize: 8)),],),const Spacer(),TolySelect(fontSize: 11,cellStyle: lightStyle,data: data.map((e) => calcFun(e)).toList(),selectIndex: selectIndex,iconSize: 16,height: 25,width: 110,maxHeight: 200,onSelected: (int index) => onSelect(data[index]),)],),);}
}

4. Flex Playground 功能實現 - 數據邏輯層

FlexOpTool 提供了交互過程中數據變化的時機,使用者需要在對應的時機來維護狀態數據的正確性。

image.png

如下所示,_onAddBox 方法,會在 DisplayItem 列表中增加一個色塊,觸發 setState 重新構建;_deleteSelectIndex 方法將移除對應索引的色塊,并重新構建更新界面:

void _onAddBox(Size size) {int index = _data.length + 1;Color color = kColors[index % kColors.length];_data.add(DisplayItem(width: size.width, height: size.height, color: color));setState(() {});
}void _deleteSelectIndex() {if (_selectIndex < 0 || _selectIndex >= _data.length) {$message.warning(message: '請先選擇刪除的色塊!');return;}_data.removeAt(_selectIndex);_selectIndex = -1;setState(() {});
}

當屬性數據變化,通過 _onAttrChange 方法更新 _attr 數據即可;重置回調時,將三個狀態數據設為初始值:

void _onAttrChange(FlexAttr attr) {setState(() {_attr = attr;});
}void _reset({bool init=false}){_attr = FlexAttr(direction: Axis.horizontal);_data = [DisplayItem(width: 20, height: 20, color: kColors[0]),DisplayItem(width: 10, height: 80, color: kColors[1]),DisplayItem(width: 40, height: 30, color: kColors[2]),DisplayItem(width: 60, height: 20, color: kColors[3]),];_selectIndex = -1;if(init) return;setState(() {});
}

這就是 Flex Playground 功能的核心實現過程,緊緊把握 狀態數據組件構建交互事件數據維護 四個方面,就可以很輕松地完成任何功能需求。其他的 Playground 實現方式類似,就不一一介紹了,希望大家可以在 布局游樂場 中,通過交互的方式,學習更多知識。
以后,FlutterUnit 將在 TolyUI 的加持下,支持更多的好玩和使用的功能,敬請期待~

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

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

相關文章

【數據分析一:Data Collection】信息檢索

本節內容含有各典型數據集的推薦&#xff0c;以及其網址&#xff0c;大家根據需要自取 一、檢索 最簡單、最靈活的數據獲取方式就是依靠檢索&#xff1a; Google&#xff1a;更適合搜索英文信息 Google Dataset Search&#xff08;Google 數據集搜索&#xff09; 網址&…

23.ssr和csr的對比?如何依賴node.js實現

1.為什么說ssr 的node中間層請求速度快。相當于內網&#xff1f; 那vue.js加載怎么沒有ssr和csr的說法啊 第一問&#xff1a;為什么說 SSR 的 Node 中間層請求速度快&#xff1f;是不是相當于內網&#xff1f; ? 是的&#xff0c;本質上就是「內網請求」&#xff0c;所以更快…

力扣刷題(第六十四天)

靈感來源 - 保持更新&#xff0c;努力學習 - python腳本學習 第一個錯誤的版本 解題思路 初始化左右邊界&#xff1a;左邊界 left 1&#xff0c;右邊界 right n。二分查找循環&#xff1a; 計算中間版本號 mid。若 mid 是錯誤版本&#xff0c;說明第一個錯誤版本在 [le…

【圖像處理入門】11. 深度學習初探:從CNN到GAN的視覺智能之旅

摘要 深度學習為圖像處理注入了革命性動力。本文將系統講解卷積神經網絡(CNN)的核心原理,通過PyTorch實現圖像分類實戰;深入解析遷移學習的高效應用策略,利用預訓練模型提升自定義任務性能;最后揭開生成對抗網絡(GAN)的神秘面紗,展示圖像生成與增強的前沿技術。結合代…

C++法則4: 如果一個構造函數的第一個參數是自身類類型的引用,且任何額外參數都有默認值,則此構造函數是拷貝構造函數。

C法則4&#xff1a; 如果一個構造函數的第一個參數是自身類類型的引用&#xff0c;且任何額外參數都有默認值&#xff0c;則此構造函數是拷貝構造函數。 拷貝構造函數的定義&#xff1a; 第一個參數是自身類類型的引用&#xff1a; 必須是引用&#xff08;通常為const引用&…

從頭搭建環境安裝k8s遇到的問題

基本信息 master節點IP&#xff1a; 172.31.0.3 node01節點IP&#xff1a;172.31.0.4 node02節點IP&#xff1a;172.31.0.5 子網掩碼&#xff1a;255.255.0.0 網關&#xff1a;172.31.0.2 DNS:114.114.114.114 安裝前要檢查的信息 檢查三臺主機的mac地址是否重復&#xff1a…

Flask入門指南:從零構建Python微服務

1. Flask 是什么&#xff1f; Flask 是一個 微框架&#xff08;Microframework&#xff09;&#xff0c;特點包括&#xff1a; 輕量靈活&#xff1a;核心僅包含路由和模板引擎&#xff0c;其他功能通過擴展實現易于學習&#xff1a;代碼直觀&#xff0c;適合快速開發小型應用…

【LINUX網絡】網絡socet接口的基本使用以及實現簡易UDP通信

根據本系列上兩篇關于網絡的初識介紹&#xff0c;現在我們開始實現一個UDP接口&#xff0c;以加強對該接口的理解。 1 . 服務器端 在本篇中&#xff0c;主要按照下面內容來實現&#xff1a; 創建并封裝服務端&#xff1a;了解創建服務端的基本步驟 創建并封裝客戶端&#xff0…

MySQL的索引事務

索引 是什么 類似于目錄&#xff0c;提高查詢的速度&#xff0c;但是本身會占用空間&#xff0c;增刪數據的時候也需要維護索引。所以查詢操作頻繁的時候可以創建索引。如果非條件查詢列&#xff0c;或經常做插入、修改操作&#xff0c;或磁盤空間不足時&#xff0c;不考慮創…

安卓9.0系統修改定制化____第三方美化 bug修復 移植相關 輔助工具 常識篇 八

在修改rom中。有時候不可避免的需要對系統進行美化以及一些第三方系統的bug修復。在操作前需要了解系統的一些基本常識。例如同平臺移植 跨平臺移植以及內核移植 apk反編譯等等相關的知識。今天解析的這款工具雖然不是直接面向安卓9.0.但對于了解以上的一些必備常識還是不錯的 …

云服務器與物理服務器對比:選擇最適合的業務服務器解決方案

更多云服務器知識&#xff0c;盡在hostol.com 在現代 IT 基礎設施中&#xff0c;云服務器與物理服務器是兩種常見的服務器解決方案。隨著云計算技術的迅猛發展&#xff0c;越來越多的企業開始轉向云服務器&#xff0c;但也有一些企業仍然堅持使用物理服務器&#xff0c;尤其是…

【redis使用場景——緩存——雙寫一致性】

redis使用場景——緩存——雙寫一致性 雙寫一致性問題的本質與場景典型不一致場景分析??并發寫操作導致的不一致????讀寫交叉導致的不一致????主從同步延遲導致的不一致?? 解決延遲雙刪策略&#xff08;推薦&#xff09;優點??&#xff1a;??缺點??&#xff…

【ArcGIS】在線影像底圖調用

【ArcGIS】在線影像底圖調用 一、 歷史影像的調用二、ArcGIS online底圖調用三、結語 一、 歷史影像的調用 ESRI官方推出了World Imagery Wayback是一個提供全球范圍內歷史影像的在線服務。 官網地址&#xff1a;https://livingatlas.arcgis.com/wayback/ 操作步驟&#xff1…

密度估計:從零星足跡重建整體畫像

想象你是一位偵探&#xff0c;案發現場只留下幾個零散的腳印。**如何通過這些碎片&#xff0c;推斷嫌疑人的身高體重&#xff1f;甚至預測他下一步的藏身之處&#xff1f;** 這種從局部反推整體的能力&#xff0c;正是**密度估計&#xff08;Density Estimation&#xff09;** …

B004基于STM32F401單片機簡易交通燈實訓數碼管顯示設計仿真資料

視頻演示地址:https://www.bilibili.com/video/BV1GvNDzFEd9/ 運行環境 仿真軟件:proteus8.17(切記別的版本不能運行) 編程軟件:MDK525 STM32 cubmx版本:6.11.1(切記別的版本不能運行) 原理圖畫圖軟件:AD10 功能說明&#xff1a; 以STM32F401CB單片機為核心簡易交通燈功能如下。…

沒掌握的知識點記錄

1、微內核的主要優點在于結構清晰、內核代碼量少&#xff0c;安全性和可靠性高、可移植性強、可伸縮性、可擴展性高&#xff1b;其缺點是難以進行良好的整體優化、進程間互相通信的開銷大、內核功能代碼不能被直接調用而帶來服務的效率低。 2、題目&#xff1a; 分頁內存管理…

linux 遠程終端執行qt應用顯示到接入的物理顯示器上

在顯示器打開終端執行&#xff1a; xhost local: 在遠程終端執行&#xff1a; export DISPLAY:0然后在終端執行qt應用就可以。 xhost local: 功能&#xff1a;允許本地用戶&#xff08;local:&#xff09;訪問 X 服務器&#xff08;X11 圖形系統&#xff09;。 原理&#xf…

【AI驅動網絡】

一、AI 驅動網絡 1.1 什么是網絡 1.1.1、網絡的定義 ?網絡是由若干節點?(如計算機、服務器、移動設備等)和連接這些節點的鏈路?(有線或無線傳輸介質)構成的系統,用于實現地理位置分散的獨立設備之間的信息交換、資源共享與協同工作。在計算機領域,網絡是信息傳輸、…

Python期末速成

一.基礎內容 賦值語句&#xff1a; a 1 b "mayday" 標識符規則&#xff1a; 1.字母&#xff0c;數字&#xff0c;下劃線&#xff0c;漢字組成。但數字不能開頭 2.不能是保留字 3.特殊符號不行&#xff0c;*&#xffe5;^等 注釋是在語句前面加&#xff03; …

【時時三省】(C語言基礎)指針變量例子

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 存放地址的變量是指針變量&#xff0c;它用來指向另一個對象&#xff08;如變量、數組、函數等&#xff09;。 那么&#xff0c;怎樣定義和使用指針變量呢? 先分析一個例子。 例題 通過…