網站首頁 編程語言 正文
在Flutter 底部彈窗詳解一篇中介紹了底部彈窗的實現。發出后有在琢磨如何實現多選,這也是很常用的一個功能。本篇介紹實現多選的思路和實現方式。
多選和單選的不同之處
單選的時候,選中一個就可以直接把結果返回,因此本身底部彈窗無需狀態管理。但到多選的時候,需要知道當前選中的選項,有選項被點擊的時候需要存儲下來,當再次被點擊的時候要清空這個選項,同時界面還需要同步更新,因此就涉及到狀態管理了。
實現方式
在Flutter 中提供了一個 StatefulBuilder
的類,提供了一個 builder
方法構建有狀態組件,并且提供了狀態更新方法,因此在里面完成狀態管理。
StatefulBuilder(builder: (context1, setState) { return Widget; } )
在這個 builder
方法中,setState
其實就是對應狀態組件的setState
對應的方法,這個 state 就是用于控制 StatefulBuilder
生成的組件的狀態的。這種方式有點類似于 React
的 useState
的鉤子函數用法。
界面變更
首先底部彈窗的頭部組件要更換,需要增加確認按鈕,將構建該組件的方法抽離出來如下所示:
Widget _getModalSheetHeaderWithConfirm(String title, {Function onCancel, Function onConfirm}) { return SizedBox( height: 50, child: Row( children: [ IconButton( icon: Icon(Icons.close), onPressed: () { onCancel(); }, ), Expanded( child: Center( child: Text( title, style: TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0), ), ), ), IconButton( icon: Icon( Icons.check, color: Colors.blue, ), onPressed: () { onConfirm(); }), ], ), ); }
通過這個方法可以通過外部參數傳入標題,取消響應事件回調和確認事件回調,通用性更強。
其次是選項需要有圖標標記,選中時顯示為勾選框,未選中時是空白框,這需要通過狀態數據來控制。這里我們使用了 Set
類型,保證選中的數據集是不重復的。在點擊選項時,如果選項對應數組的下標在 Set
內,則從中移出,表示取消選擇;如果不在 Set
內,則加入其中,表示選中。這個過程需要包在 state
里,以更新界面。通過列表元素當前的下標是否在 Set
內,如果在則顯示為選中,不在則顯示未選中。
最后是確認事件的回調,確認后將 Set
的元素轉換為數組返回,然后供上級業務使用選中的下標數組判斷選擇了那些數據。
代碼實現
關鍵代碼實現如下,重點關注一下StatefulBuilder
的使用和利用 Set
這一數據類型對應的選擇和取消選擇的操作業務邏輯。
Future<List<int>> _showMultiChoiceModalBottomSheet( BuildContext context, List<String> options) async { Set<int> selected = Set<int>(); return showModalBottomSheet<List<int>>( backgroundColor: Colors.transparent, isScrollControlled: true, context: context, builder: (BuildContext context) { return StatefulBuilder(builder: (context1, setState) { return Container( clipBehavior: Clip.antiAlias, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.only( topLeft: const Radius.circular(20.0), topRight: const Radius.circular(20.0), ), ), height: MediaQuery.of(context).size.height / 2.0, child: Column(children: [ _getModalSheetHeaderWithConfirm('多選底部彈窗', onCancel: () { Navigator.of(context).pop(); }, onConfirm: () { Navigator.of(context).pop(selected.toList()); }, ), Divider(height: 1.0), Expanded( child: ListView.builder( itemBuilder: (BuildContext context, int index) { return ListTile( trailing: Icon( selected.contains(index) ? Icons.check_box : Icons.check_box_outline_blank, color: Theme.of(context).primaryColor), title: Text(options[index]), onTap: () { setState(() { if (selected.contains(index)) { selected.remove(index); } else { selected.add(index); } }); }, ); }, itemCount: options.length, ), ), ]), ); }); }, ); }
總結
本篇介紹了底部彈窗實現多選的方式,其中實現的方式還可以有很多種,例如直接在自定義組件中使用有狀態組件。這里介紹的方法可以作為一個參考,通過動態構建有狀態組件能夠簡單快速地實現底部彈窗的多選功能。
原文鏈接:https://blog.csdn.net/shuijian00/article/details/121527176
相關推薦
- 2022-07-02 Python?matplotlib繪圖時使用鼠標滾輪放大/縮小圖像_python
- 2023-02-02 redis中的配置以及密碼設置方式_Redis
- 2022-07-01 .NET設計模式之UML類圖介紹_基礎應用
- 2022-12-02 React?Hook中的useState函數的詳細解析_React
- 2022-05-04 C語言中getchar()的原理以及易錯點解析_C 語言
- 2022-12-13 Compose狀態保存rememberSaveable原理解析_Android
- 2022-02-27 Web server failed to start. Port XXXX was already
- 2022-05-31 在.NET?MAUI應用中配置應用生命周期事件_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支