首页 > 其他分享 >Flutter3 TV 一百行自定义实现 tabbar tabview 联动

Flutter3 TV 一百行自定义实现 tabbar tabview 联动

时间:2024-01-26 16:45:23浏览次数:24  
标签:BoxDecoration index focusCard 自定义 TV tabview Expanded decoration child

系统自带的 tabbar 焦点 在 TV端无法很好的使用

  • 使用card_swiper 组件作为tabview
import 'package:card_swiper/card_swiper.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<StatefulWidget> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<String> tabs = ['推荐', '最新', '电影', '动漫', '综艺', '少综', '分类'];
  int selectedIndex = 0;
  late List<BoxDecoration> _decorations;
  final BoxDecoration holder_decoration = BoxDecoration(
    border: Border.all(width: 3, color: Colors.deepOrange),
    borderRadius: BorderRadius.all(
      Radius.circular(5),
    ),
  );
  final BoxDecoration transparent_decoration = BoxDecoration(
    border: Border.all(width: 3, color: Colors.transparent),
    borderRadius: BorderRadius.all(
      Radius.circular(5),
    ),
  );
  final SwiperController _controller = new SwiperController();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          padding: EdgeInsets.only(top: 30),
          child: Container(
            child: Column(
              children: [
                Row(
                  children: List.generate(
                    tabs.length,
                    (i) => Expanded(child: focusCard(i)),
                  ),
                ),
                Expanded(
                  child: Container(
                    decoration: BoxDecoration(color: Colors.white),
                    child: Swiper(
                      itemCount: tabs.length,
                      itemBuilder: (BuildContext context, int i) =>
                          MyCustomWidget(index: i),
                      loop: false,
                      controller: _controller,
                    ),
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget focusCard(index) {
    return Focus(
      onFocusChange: (focused) {
        setState(() {
          _decorations[index] =
              focused ? holder_decoration : transparent_decoration;
          _controller.move(index);
        });
      },
      child: Container(
        padding: EdgeInsets.only(left: 20, right: 20, bottom: 10),
        decoration: _decorations[index],
        margin: EdgeInsets.all(2),
        child: Text(tabs[index]),
      ),
    );
  }
}

class MyCustomWidget extends StatefulWidget {
  final int index;

  const MyCustomWidget({super.key, required this.index});

  @override
  State<MyCustomWidget> createState() => _MyCustomWidgetState();
}

class _MyCustomWidgetState extends State<MyCustomWidget> {
  int selectedIndex = -1;
  final BoxDecoration holder_decoration = BoxDecoration(
    border: Border.all(width: 3, color: Colors.deepOrange),
    borderRadius: BorderRadius.all(
      Radius.circular(5),
    ),
  );
  final BoxDecoration transparent_decoration = BoxDecoration(
    border: Border.all(width: 3, color: Colors.transparent),
    borderRadius: BorderRadius.all(
      Radius.circular(5),
    ),
  );

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Expanded(
          child: focusCard(0),
        ),
        Expanded(
          child: Column(
            children: [
              Expanded(
                child: focusCard(1),
              ),
              Expanded(
                child: focusCard(2),
              ),
            ],
          ),
        ),
        Expanded(
          child: Column(
            children: [
              Expanded(
                child: focusCard(3),
              ),
              Expanded(
                child: focusCard(4),
              ),
            ],
          ),
        ),
      ],
    );
  }

  Widget focusCard(index) {
    return Focus(
      onFocusChange: (focused) {
        setState(() {
          selectedIndex = focused ? index : selectedIndex;
        });
      },
      child: Container(
        decoration:
            index == selectedIndex ? holder_decoration : transparent_decoration,
        margin: EdgeInsets.all(2),
        child: Card(
          child: Center(
            child: Text(
              index == selectedIndex
                  ? '${widget.index}_${index}_Focused'
                  : '${widget.index}_${index}_UnFocused',
            ),
          ),
        ),
      ),
    );
  }
}

标签:BoxDecoration,index,focusCard,自定义,TV,tabview,Expanded,decoration,child
From: https://www.cnblogs.com/guanchaoguo/p/17989687

相关文章

  • 华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力
    本文分享自华为云社区《华为云CCETurbo:基于eBPF的用户自定义多粒度网络监控能力》,作者:云容器大未来。基于eBPF的容器监控的兴起容器具有极致弹性、标准运行时、易于部署等优点,越来越多的客户选择使用容器来部署自己的服务,随着容器规模越来越大,容器间网络交互也越来越复杂。我们需......
  • 华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力
    本文分享自华为云社区《华为云CCETurbo:基于eBPF的用户自定义多粒度网络监控能力》,作者:云容器大未来。基于eBPF的容器监控的兴起容器具有极致弹性、标准运行时、易于部署等优点,越来越多的客户选择使用容器来部署自己的服务,随着容器规模越来越大,容器间网络交互......
  • SAP dialog 自定义搜索帮助 案例+源码
    同之前的blog一样,新建一个9000的屏幕,元素清单配好ok_code即可前置准备准备一个屏幕,具体步骤和之前一样,这边也按步骤做一下状态栏因为这个只是用于搜索帮助的演示,所以不需要应用应用程序工具栏,只需要设置功能键方便返回测试即可标题9000程序PROCESSBEFOREOUTPUT.......
  • 自定义模板中数据标签
    笔记数据标签(DataTag)只是一种辨识度比较高的文本字符串,样式完全由开发人员自己说了算。比如这样的数据标签“【##日期$$】”,编写代码openDataTag("【##日期$$】")即可返回数据标签对象,进而可以对此数据标签填充数据或设置样式等操作。在实际的Word文档开发中,经常需要自动填充......
  • 在PyCharm中运行Python的unit测试时,出现‘file‘ object has no attribute ‘getvalue
    https://blog.csdn.net/m0_46900715/article/details/129725053  ......
  • 记windows自定义bat脚本自启动
    自定义Windows启动脚本简化版在本指南中,我们将使用一个简化的批处理文件(.bat)来演示如何创建自定义的Windows启动脚本。以下是一个基本的模板,您只需根据需要在:begin部分添加您的代码。@echooffif"%1"=="h"gotobeginrem获取脚本路径set"scriptPath=%~dp0"rem......
  • springBoot自定义参数注解
    springBoot自定义参数注解前置条件:新建一个springboot项目1.新建一个标记注解@Authimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***@authorwa......
  • SSAS 利用Adomd 编程实现Cube的自定义配置
    利用Adomd执行Cube数据库的配置。 需要下载:Microsoft.AnalysisServices.AdomdClient,安装,再搜索到DLL的位置,在程序里引用下载地址 环境:SqlServer2022表格模型脚本内容存放在:s01.json文件里AdomdConnectionconn=newAdomdConnection("DataSourc......
  • FluentValidation在C# WPF中的应用
    1.引言在.NET开发领域,FluentValidation以其优雅、易扩展的特性成为开发者进行属性验证的首选工具。它不仅适用于Web开发,如MVC、WebAPI和ASP.NETCORE,同样也能完美集成在WPF应用程序中,提供强大的数据验证功能。本文将深入探讨如何在C#WPF项目中运用FluentValidation进行属性验......
  • xrandr: error BadMatch (invalid parameter attributes) 无法设置自定义分辨率刷新率
    我的环境ManjaroKDENvidia显卡前言前几天在创建虚拟显示屏让iPad成为副屏时,我打算使用xrandr给虚拟显示屏自定义分辨率以及144hz的刷新率(为了与主屏幕同步)但是当进行了如下操作后发生了RT报错:❯cvt19201080144#1920x1080143.88Hz(CVT)hsync:169.35kH......