如何在颤动中自定义标签栏宽度?

Posted

技术标签:

【中文标题】如何在颤动中自定义标签栏宽度?【英文标题】:How to customize tabbar width in flutter? 【发布时间】:2018-12-16 18:26:32 【问题描述】:

嗨,我们可以在颤振中自定义标签栏宽度吗?我的标签栏宽度在这里是固定的,所以当我的标签栏中有长文本时,它不会完全显示,我想让我的标签栏宽度根据内容灵活,所以当我的文本只是短文本时,标签栏宽度会很小而且当文本是长文本时,标签栏宽度大于短文本标签。我一直在尝试在互联网上搜索它,但我找不到任何答案来解决我的问题。

【问题讨论】:

【参考方案1】:
TabBar(isScrollable: true)

制作一个可滚动的标签栏。当您的标签文本内容或标签数量不适合显示大小时,它很有用。

或者你可以这样做:

child: new TabBar(
            tabs: [
              new Container(
                width: 30.0,
                child: new Tab(text: 'hello'),
              ),
              new Container(
                  child: new Tab(text: 'world'),
              ),
            ],
          )

【讨论】:

是的,它很有用,但我想要的是让标签栏宽度更小,图标相机和聊天标签之间有很多未使用的空间,我该如何实现? whatsapp 可以做到这一点,他们可以使相机图标选项卡变得如此之小。所以问题是我们可以在颤振中做到这一点吗? 我不知道它对我不起作用,标签栏宽度仍然是固定的,所以如果总宽度为 400,它总是拆分为 200 - 200 而不是 300 - 100 等等。嗯你确定你已经尝试过了?你能确认这是否有效吗? 如果您将 TabBar 放在 PreferredSize 小部件中,它似乎可以工作。但我不确定。查看此链接:***.com/questions/44272440/… 我已经尝试过了,但仍然没有运气,我只能改变标签栏的高度,我认为答案是标签栏的指示器而不是标签栏本身。嗯,也许我们不能改变标签栏的宽度?在互联网上仍然找不到任何答案 完成了我现在已经想通了,我忘记在我以前的代码中使用是可滚动的,现在我再试一次并且添加是可滚动的,现在它可以工作了【参考方案2】:

我是这样解决这个问题的:

    bottom: TabBar(
      isScrollable: true,
      controller: _tabController,
      indicatorColor: Colors.white,
      labelPadding: EdgeInsets.symmetric(horizontal: 10.0),

      tabs: <Widget>[
        Tab(
          icon: Icon(Icons.camera_alt),
        ),
        Tab(
          text: "CONVERSAS",
        ),
        Tab(
          text: "STATUS",
        ),
        Tab(
          text: "CHAMADAS",
        )
      ],
    )

只需使用填充,我认为它适用于所有屏幕尺寸! ...别忘了:

   isScrollable: true

【讨论】:

【参考方案3】:
  double width = MediaQuery.of(context).size.width;

    double yourWidth = width  / 5;


bottom: TabBar(
            indicatorColor: Colors.white,
            indicatorSize: TabBarIndicatorSize.label,
            isScrollable: true,
            controller: _tabcontroller,
            tabs: <Widget>[
              Container(
                width: 30,
                height: 50,
                alignment: Alignment.center,
                child: Icon(
                  Icons.camera_alt,
                ),
              ),
              Container(
                width: yourWidth,
                  height: 50,
                  alignment: Alignment.center,
                  child: Text("CHATS")),
              Container(
                  width: yourWidth,
                  height: 50,
                  alignment: Alignment.center,
                  child: Text("STATUS")),
              Container(
                  width: yourWidth,
                  height: 50,
                  alignment: Alignment.center,
                  child: Text("CALL"))
            ],
          ),`


---------------

`

【讨论】:

如果您遇到有关 MediaQuery 的错误,那是因为您需要在新的 MaterialApp 小部件中提供上下文。更多这里***.com/questions/50214338/… 这对我有用。直接来自 Flutter 文档:/// 如果 [isScrollable] 为 true,则每个选项卡的宽度与其标签所需的一样宽 /// 并且整个 [TabBar] 是可滚动的。否则,每个选项卡都会获得相等的 /// 可用空间份额。 final bool isScrollable; indicatorColor: Colors.white,帮我设置指标颜色。谢谢。【参考方案4】:

您可以像这样将labelPadding 添加到您的 TabBar 小部件:

child: TabBar(
        indicatorColor: Colors.white,
        labelPadding: EdgeInsets.symmetric(horizontal: 2.0),
        ....
        tabs: <Tab>[
                     ......
        ]
)
......

或者你可以这样做(我不推荐)

在 material/tabs.dart 文件中,编辑这一行:

padding: widget.labelPadding ?? tabBarTheme.labelPadding ?? kTabLabelPadding,

类似的东西

padding: EdgeInsets.symmetric(horizontal: 2.0),

默认情况下,flutter 使用kTabLabelPadding 进行填充。

颤振问题here

【讨论】:

使用标签填充可以正常工作,非常感谢!【参考方案5】:

适用于不同尺寸的设备:

double orjWidth = MediaQuery.of(context).size.width;
double cameraWidth = orjWidth/24;
double yourWidth = (orjWidth - cameraWidth)/5;

    bottom: TabBar(
      controller: _tabController,
      indicatorColor: Colors.white,
      labelPadding: EdgeInsets.symmetric(horizontal:(orjWidth - ( cameraWidth + yourWidth*3))/8),
      isScrollable: true,
      tabs: [
        Container(
          child: Tab(icon: Icon(Icons.camera_alt)),
          width: cameraWidth,
        ),
        Container(
          child: Tab(
            text: "CHATS",
          ),
          width: yourWidth,
        ),
        Container(
          child: Tab(
            text: "STATUS",
          ),
          width: yourWidth,
        ),
        Container(
          child: Tab(
            text: "CALL",
          ),
          width: yourWidth,
        ),

【讨论】:

【参考方案6】:

首先,对不起我的英语。

5 小时在网站上搜索后,我找到了解决方案,

注意:此解决方案仅适用于 WhatsApp 之类的制作!

    按Ctrl+TabBar,之后会显示类似的源代码-->

    在 Show tabs.dart 之后,你只需要更改 1 行 -->

    删除第 1138 和 1139 行并放入此代码

if (!widget.isScrollable && index != 0)
        wrappedTabs[index] = Expanded(child: wrappedTabs[index]);
    然后保存并在设备上运行。 我的设备屏幕:) -->

希望对你有帮助。

【讨论】:

你不应该编辑 sdk 文件,因为每次更新都会在更新后被忽略 @MohamedKamel 但这是一个简单的解决方案,为什么你要投票 -1,我只是想帮忙。 因为它是错误的解决方案“你不应该编辑SDK文件,因为每次更新都会在更新flutter后被解除”然后错误会再次上升,你可能会在其他项目中遇到错误 我将其标记为删除,因为它显然不是解决方案。它基本上是一个“颤振核心黑客”。

以上是关于如何在颤动中自定义标签栏宽度?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITabBarController 中自定义更多选项卡

6.1 如何在spring中自定义xml标签

如何在颤动中自定义切换按钮[关闭]

如何摆脱自定义底部导航栏颤动周围的空白?

在iPhone中自定义TabBar

如何固定表格视图中自定义单元格文本字段的标签值?