Flutter 如何在Flatter中创建自定义选项卡栏

Flutter 如何在Flatter中创建自定义选项卡栏,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我想在我的主体中实现一个自定义的可滚动选项卡栏,而不是在appBar中 我会从一个水平滚动的列表视图开始,然后构建数千个列表块元素,并使它们可以单击。如果要滑动,请添加一个手势检测器,您可以创建一个具有相同视图的自定义列表。下面是示例代码 ListView.builder( itemBuilder: (_, count) { return Container( decoration: BoxDecor

我想在我的主体中实现一个自定义的可滚动选项卡栏,而不是在appBar中


我会从一个水平滚动的
列表视图开始,然后构建数千个
列表块
元素,并使它们可以单击。如果要滑动,请添加一个
手势检测器

,您可以创建一个具有相同视图的自定义列表。下面是示例代码

ListView.builder(
              itemBuilder: (_, count) {
                return Container(
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(10.0),
                      color: Colors.green),
                  child: GestureDetector(
                    onTap: (){
                      print("You clicked");
                    },
                    child: Text(
                      list[count],
                      style: TextStyle(color: Colors.white, fontSize: 12),textAlign: TextAlign.center,
                    ),
                  ),
                );
              },
              itemCount: list.length,
              scrollDirection: Axis.horizontal,
            )

尝试使用“NestedScrollView”并将信息放在选项卡栏外的“flexibleSpace”中

所以这并不是你想要的,你可以用水平滚动(scrollView)来代替底部的滚动条,但我希望这能把你推向正确的方向。这段代码基本上使用
pageView
来显示页面,由于有一个页面控制器,您可以将任何按钮或
onPress
设置为特定页面的动画

如果你有任何问题,请告诉我

import 'package:flutter/material.dart';

class TestWidget extends StatefulWidget {
  TestWidget({Key key}) : super(key: key);

  @override
  _TestWidgetState createState() => _TestWidgetState();
}

class _TestWidgetState extends State<TestWidget> {
  int _selectedIndex = 0;

  PageController _pageController;

  @override
  void initState() {
    super.initState();
    _pageController = PageController();
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Tab Bar"),
      ),
      body: Center(
        child: Column(
          children: <Widget>[ 
            Expanded(
              flex: 10,
              child: ButtonBar(
                alignment: MainAxisAlignment.center,
                children: <Widget>[
                  FlatButton(
                    splashColor: Colors.blueAccent,
                    color: Colors.blue,
                    onPressed: () {
                      _pageController.animateToPage(0, duration: Duration(milliseconds: 500), curve: Curves.ease);
                    },
                    child: Text("One",),
                  ),
                  FlatButton(
                    splashColor: Colors.blueAccent,
                    color: Colors.blue,
                    onPressed: () {
                      _pageController.animateToPage(1, duration: Duration(milliseconds: 500), curve: Curves.ease);
                    },
                    child: Text("Two",),
                  ),
                  FlatButton(
                    splashColor: Colors.blueAccent,
                    color: Colors.blue,
                    onPressed: () {
                      _pageController.animateToPage(2, duration: Duration(milliseconds: 500), curve: Curves.ease);
                    },
                    child: Text("Three",),
                  )
                ],
              ),
            ),
            Expanded(
              flex: 40,
              child: PageView(
                controller: _pageController,
                children: [
                  Text("Page One"),
                  Text("Page Two"),
                  Text("Page Three")
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
类TestWidget扩展了StatefulWidget{
TestWidget({Key}):超级(Key:Key);
@凌驾
_TestWidgetState createState();
}
类_TestWidgetState扩展了状态{
int _selectedIndex=0;
页面控制器_页面控制器;
@凌驾
void initState(){
super.initState();
_pageController=pageController();
}
@凌驾
无效处置(){
_pageController.dispose();
super.dispose();
}
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“选项卡栏”),
),
正文:中(
子:列(
儿童:[
扩大(
弹性:10,
孩子:巴顿巴(
对齐:MainAxisAlignment.center,
儿童:[
扁平按钮(
splashColor:Colors.blueAccent,
颜色:颜色,蓝色,
已按下:(){
_pageController.animateToPage(0,持续时间:持续时间(毫秒:500),曲线:Curves.ease);
},
子项:文本(“一”),
),
扁平按钮(
splashColor:Colors.blueAccent,
颜色:颜色,蓝色,
已按下:(){
_pageController.animateToPage(1,持续时间:持续时间(毫秒:500),曲线:Curves.ease);
},
子项:文本(“两个”),
),
扁平按钮(
splashColor:Colors.blueAccent,
颜色:颜色,蓝色,
已按下:(){
_pageController.animateToPage(2,持续时间:持续时间(毫秒:500),曲线:Curves.ease);
},
子:文本(“三”),
)
],
),
),
扩大(
弹性:40,
子:页面视图(
控制器:_pageController,
儿童:[
正文(“第一页”),
正文(“第二页”),
正文(“第三页”)
],
),
),
],
),
),
);
}
}

这基本上允许您使用任何选项卡栏或按钮来切换页面,同时保持滑动功能:-)

您尝试了什么?我尝试了一些解决方案,但找不到解决方案|我想我将在本周晚些时候为您想要的东西制作一个包,因为我也需要它,但请使用下面的pageView查看我的解决方案!另外,我认为这值得一看:TabController呢??我想要一个自定义选项卡栏而不仅仅是列表视图如果你指的是带有“TabController”的可拖动功能,那么你可以使用GestureDragStartCallback看到这一点,当指针水平拖动时,你可以添加一个函数来更改页面。如果可能,我更喜欢使用颤振选项卡控制器和选项卡栏