Flutter TabBar與TabBarView聯動及獲取當前點擊欄目索引

? ? ?TabBar還有TabBarView都是谷歌flutter官方組件庫——Material組件庫提供的組件,其中TabBar用于導航切換,TabBarView則是配合其切換顯示的對應的視圖,官網參考地址:TabBarView class - material library - Dart API。

? ? ? ? 實現一體聯動有兩種實現方式:使用默認控制器(DefaultTabController)和自定義控制器。使用自定義控制器靈活性更高,但是需要指定TabController的length屬性,但有些情況下欄目的實際數據是從網絡上異步加載讀取的,這個TabController的length無法動態更新或后面重新指定,非常扯淡,具體實現參考:flutter 之 TabBar、TabBarView的使用 - 簡書。

? ? ? 本文主要介紹在使用DefaultTabController下,實現獲取點擊當前欄目的索引,包括點擊TabBar和滑動TabBarView以及視圖狀態保持,示例如下:

  late int _selectIndex = 0;late final ScrollController _scrollController;late final NewsPageViewModel _vm = NewsPageViewModel();late final _scaffoldKey = GlobalKey<_NewsPageViewState>();@overridevoid initState() {// TODO: implement initStatesuper.initState();//欄目滑動索引改變_scrollController = ScrollController(onDetach: (ScrollPosition position) {if (_scaffoldKey.currentContext != null) {final controller =DefaultTabController.of(_scaffoldKey.currentContext!);controller.addListener(() {if (controller.index.toDouble() == controller.animation?.value) {//loadListDataFor(controller.index);debugPrint(controller.index);}});}});}@overrideWidget build(BuildContext context) {// TODO: implement buildreturn BaseView<NewsPageViewModel>(viewModel: _vm,build: (context, viewModel, child) {if (viewModel.state == ViewState.Busy) {return BaseView.loadingWidget();} else {return DefaultTabController(initialIndex: _selectIndex,length: viewModel.arrCategory.length,child: NestedScrollView(controller: _scrollController,headerSliverBuilder:(BuildContext context, bool innerBoxIsScrolled) {return <Widget>[SliverOverlapAbsorber(handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),sliver: SliverAppBar(title: Utils.shareInstance.customPageTitle('資訊'),//標題橫向間距titleSpacing: 15,//左側的圖標或文字,多為返回箭頭leading: null,//左邊按鈕的寬度leadingWidth: 15,//居中centerTitle: false,//標題欄是否固定pinned: true,//滑動時是否懸浮floating: false,//配合floating使用snap: false,//是否顯示在狀態欄的下面,false就會占領狀態欄的高度primary: true,//設置分欄區域上面的高度// expandedHeight: 0,elevation: 0,//是否顯示陰影,直接取值innerBoxIsScrolled,展開不顯示陰影,合并后會顯示forceElevated: innerBoxIsScrolled,//自定義導航和中間內容的展示flexibleSpace: null,//導航欄背景色backgroundColor: K_APP_NAVIGATION_BACKGROUND_COLOR,//TabBar 分欄標題bottom: _setCategoryTabBar(viewModel),),)];},//分欄展示的頁面信息body: _setCategoryTabBarView(context, viewModel),));}},onModelReady: (viewModel) {//加載欄目viewModel.categoryLoad(context, isLoading: false);});}@overridevoid dispose() {_scrollController.dispose();// TODO: implement disposesuper.dispose();}//MARK: - 擴展
extension on _NewsPageViewState {//分欄菜單TabBar _setCategoryTabBar(NewsPageViewModel viewModel) {return TabBar(key: _scaffoldKey,//設置對齊方式(否則左邊有空白)tabAlignment: TabAlignment.start,//是否允許滾動isScrollable: true,//未選中的顏色unselectedLabelColor: Utils.shareInstance.hexToInt(0x505050),//未選中的樣式unselectedLabelStyle: const TextStyle(fontSize: 15),//選中的顏色labelColor: K_APP_TINT_COLOR,//選中的樣式labelStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),//底部滑動條樣式indicatorSize: TabBarIndicatorSize.label,//底部滑動條顏色indicatorColor: K_APP_TINT_COLOR,//菜單項目tabs: viewModel.arrCategory.map((item) {return Tab(text: item.name);}).toList(),//點擊事件onTap: (index) {debugPrint(index);//loadListDataFor(index);setState(() {_selectIndex = index;});},);}// tabBar 分欄菜單各個頁面Widget _setCategoryTabBarView(BuildContext context, NewsPageViewModel viewModel) {return TabBarView(children: viewModel.arrCategory.map((item) {//設置UIreturn SafeArea(top: false,bottom: false,child: Builder(builder: (BuildContext context) {return CustomScrollView(slivers: [SliverOverlapInjector(handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),),SliverPadding(padding: EdgeInsets.zero,sliver: SliverFixedExtentList(delegate: SliverChildBuilderDelegate((BuildContext context, int index) {final m = viewModel.arrList[index];if (m.className == '快訊') {//7x24快訊return NewsPageViewInformationCell(index, m, context, viewModel);}return NewsPageViewCell(index, m, context, viewModel);}, childCount: viewModel.arrList.length),itemExtent: 50.0 //item高度或寬度,取決于滑動方向),)],);},));}).toList());}}

上面方法進過實際測試,可以實現點擊和滑動時獲取當前欄目的索引,以便根據索引執行加載當前頁面的欄目數據的業務邏輯。隨之會產生新的問題就是欄目來回切換沒有保持頁面的狀態,會重復加載數據,解決思路是借助?AutomaticKeepAliveClientMixin 并設置?wantKeepAlive 為true,在PageView和PageController組合中同樣適用,效果如下:

86_1720350605

參考Demo,日拱一卒,持續更新

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

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

相關文章

輕松搭建RAG:澳鵬RAG開發工具

我們很高興地宣布推出RAG開發工具&#xff0c;這是澳鵬大模型智能開發平臺的一項新功能。此功能可幫助團隊輕松創建高質量的檢索增強生成 (RAG) 模型。 什么是 RAG&#xff1f; 檢索增強生成 (RAG) 通過利用大量外部數據源&#xff08;例如企業的知識庫&#xff09;顯著增強了…

文獻閱讀(1)——深度強化學習求解車輛路徑問題的研究綜述

doi&#xff1a; 10.3778/j.issn.1002-8331.2210-0153 深度強化學習求解車輛路徑問題的研究綜述 (ceaj.org) 組合最優化問題&#xff08; combinatorial optimization problem&#xff0c; COP &#xff09; 日常生活中常見的 COP 問題有旅行商問題&#xff08;traveling sale…

數字化轉型領航者:佑美科技塑造智能健康新生態

在全球數字化轉型的浪潮中,佑美專注于智能健康解決方案的創新,正以其卓越的技術實力和前瞻性的戰略眼光,引領著智能穿戴設備和健身器械行業的未來趨勢。佑美科技不僅深耕數字化轉型,更在多個領域獲得了國家級和省級的權威認可,彰顯了其在智能健康領域的影響力。 智能穿戴設備正…

[數據結構] 基于選擇的排序 選擇排序堆排序

標題&#xff1a;[數據結構] 基于選擇的排序 選擇排序&&堆排序 水墨不寫bug &#xff08;圖片來源于網絡&#xff09; 目錄 &#xff08;一&#xff09;選擇排序 實現&#xff1a;(默認從小到大排序) 優化后實現方法&#xff1a; &#xff08;二&#xff09;堆排序…

【Java】垃圾回收學習筆記(二):分代假說與垃圾回收算法

文章目錄 0. 分代收集理論分代假說分代GC定義 1. 垃圾回收算法1.1 標記清除&#xff08;Mark-Sweep&#xff09;算法優點缺點 1.2 標記復制算法優點缺點為什么是8:1:1&#xff1f; 1.3 標記整理算法優點缺點 2. 是否移動&#xff1f;Reference 0. 分代收集理論 分代假說 現在…

Navicat和MySQL的安裝

1、下載 Navicat Navicat 官網&#xff1a;www.navicat.com.cn/ 在產品中可以看到很多的產品&#xff0c;點擊免費試用 Navicat Premium 即可&#xff0c;是一套多連數據庫開發工具&#xff0c;其他的只能連接單一類型數據庫 點擊試用 選擇系統直接下載 二、安裝 Navicat 安…

代碼江湖:Python 中的進程與線程

大家好&#xff0c;我是闊升。今天&#xff0c;咱們來聊聊 Python 中的兩個"老熟人"——進程和線程。這兩個概念可以說是 Python 多任務編程中的"雙子星"&#xff0c;既相似又不同&#xff0c;讓不少小伙伴們頭疼不已。不過別擔心&#xff0c;今天我們就來…

element el-table實現表格動態增加/刪除/編輯表格行,帶校驗規則

本篇文章記錄el-table增加一行可編輯的數據列&#xff0c;進行增刪改。 1.增加空白行 直接在頁面mounted時對form里面的table列表增加一行數據&#xff0c;直接使用push() 方法增加一列數據這個時候也可以設置一些默認值。比如案例里面的 產品件數 。 mounted() {this.$nextTi…

latex 使用 thanks 首頁空白 問題

寫IEEE journal的時候遇到的問題……用latex寫了\thanks&#xff0c;編譯的論文第一頁是空的&#xff0c;這是因為\thanks要在\author內部&#xff0c;然后再用\maketitle&#xff0c;即\author{… \thanks{}}。這樣的話詳細信息就會出現在論文首頁的左下角 另外&#xff0c;\…

linux創建定時任務

crontab方式 先查看是否有cron systemctl status crond 沒有的話就安裝 yum install cronie 打開你的crontab文件進行編輯。使用以下命令打開當前用戶的crontab文件&#xff1a; crontab -e * * * * * /export/test.sh >> /export/test.log 2>&1/export/test.s…

差分算法中的F 和CR參數

自查使用。。F 類似梯度的大小 兩者都用于種群中新個體的生成

leetcode--從中序與后序遍歷序列構造二叉樹

leeocode地址&#xff1a;從中序與后序遍歷序列構造二叉樹 給定兩個整數數組 inorder 和 postorder &#xff0c;其中 inorder 是二叉樹的中序遍歷&#xff0c; postorder 是同一棵樹的后序遍歷&#xff0c;請你構造并返回這顆 二叉樹 。 示例 1: 輸入&#xff1a;inorder …

Unity插件 Unitask學習日志

Unity插件 Unitask學習日志 下載地址 https://github.com/Cysharp/UniTask點擊這里可以查閱中文文檔 在Unity 2020,2021 中使用UPM下載會找不到&#xff0c;可以使用2022版本的unity可以在upm中找到。 安裝方式&#xff1a; 下載zip之后解壓&#xff0c; 復制Plugins 到Uni…

uniapp小程序使用webview 嵌套 vue 項目

uniapp小程序使用webview 嵌套 vue 項目 小程序中發送 <web-view :src"urlSrc" message"handleMessage"></web-view>export default {data() {return {urlSrc: "",};},onLoad(options) {// 我需要的參數比較多 所以比較臃腫// 獲取…

01. 數組篇(進行中......)

一. 前綴和技巧 &#xff08;1&#xff09;前綴和 前綴和技巧適用于快速、頻繁地計算一個索引區間內的元素之和。 class NumArray { public:vector<int> preSum; //前綴和數組NumArray(vector<int>& nums) {//preSum[0] 0&#xff0c;便于計算累加和preSum…

Qt圖形編輯類使用總結—正在編輯中

Qt的圖形編輯通常會涉及以下三個類:QGraphicsView類、QGraphicsScene類及QGraphicsItem類。 QGraphicsView 是構建復雜圖形用戶界面的強大工具,尤其適用于那些需要動態更新、可交互的2D圖形化應用程序,如圖表繪制、流程圖編輯器、游戲地圖顯示等等。通過結合使用 QGraphics…

Spring中的工廠模式詳解及應用示例

1. Spring中的BeanFactory BeanFactory是一個接口&#xff0c;表示它是一個工廠&#xff0c;負責生產和管理bean。在Spring中&#xff0c;BeanFactory是IOC容器的核心接口&#xff0c;定義了管理Bean的通用方法&#xff0c;如 getBean 和 containsBean。 BeanFactory與IOC容器…

Python編程:如何有效等待套接字的讀取與關閉

背景介紹 網絡編程是現代應用程序開發的重要組成部分&#xff0c;尤其是在大數據和實時通信的背景下。套接字&#xff08;Socket&#xff09;作為網絡通信的核心技術&#xff0c;是開發網絡應用程序的基礎。在Python編程中&#xff0c;如何有效地等待套接字的讀取與關閉事件是…

柔性測斜儀:監測鉆孔位移的核心利器

柔性測斜儀&#xff0c;作為一款創新的測量工具&#xff0c;憑借其卓越的設計與性能&#xff0c;在地下建筑、橋梁、隧道及水利水電工程等領域展現出非凡的應用價值。其安裝便捷、操作簡便、高精度及長壽命等特性&#xff0c;使之成為監測鉆孔垂直與水平位移的理想選擇。以下是…

算力共享,分布式大模型是什么,模型并行,流水線并行

目錄 算力共享,分布式大模型是什么 一、算力共享 二、分布式大模型 AllReduce是什么 原理概述 具體原理 簡單例子 模型并行,流水線并行是什么 模型并行 流水線并行 環形通信(如Ring AllReduce)、樹形通信(如Tree AllReduce 環形通信(Ring AllReduce) 樹形通…