Flutter 如何在Flatter中创建带有“下一步”和“上一步”按钮的可滚动选项卡

Flutter 如何在Flatter中创建带有“下一步”和“上一步”按钮的可滚动选项卡,flutter,dart,flutter-layout,Flutter,Dart,Flutter Layout,我正在尝试创建一个带有“下一个”和“上一个”按钮的可滚动选项卡列表,以便当我单击这些按钮时,可以看到视图中不存在的下一个隐藏选项卡。反之亦然。 注意按钮 到目前为止,我已经知道了这些,但是我无法捕捉到视图中的标签并相应地采取行动,有人能帮忙吗 class NewEntryPage extends StatefulWidget { @override State<StatefulWidget> createState() => NewEntryPageState();

我正在尝试创建一个带有“下一个”和“上一个”按钮的可滚动选项卡列表,以便当我单击这些按钮时,可以看到视图中不存在的下一个隐藏选项卡。反之亦然。

注意按钮

到目前为止,我已经知道了这些,但是我无法捕捉到视图中的标签并相应地采取行动,有人能帮忙吗

class NewEntryPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => NewEntryPageState();
}

class NewEntryPageState extends State<NewEntryPage>
    with SingleTickerProviderStateMixin {
  final List<Tab> myTabs = <Tab>[
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
    Tab(text: 'bro'),
  ];

  TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: myTabs.length);
  }

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

  @override
  Widget build(BuildContext context) {
    double width = MediaQuery.of(context).size.width;
    return Column(
      children: <Widget>[
        Container(
          margin: EdgeInsets.symmetric(vertical: 20.0),
          padding: const EdgeInsets.all(10.0),
          color: Colors.white,
          child: Column(
            children: <Widget>[
              Container(
                child: Row(
                  children: [
                    IconButton(
                      icon: Icon(Icons.arrow_back_ios),
                      onPressed: () {
                        if (_tabController.index > 0) {
                          _tabController.animateTo(_tabController.index - 1);
                        } else {
                          Scaffold.of(context).showSnackBar(SnackBar(
                            content: Text("Can't go back"),
                          ));
                        }
                      },
                    ),
                    Expanded(
                      child: TabBar(
                        isScrollable: true,
                        controller: _tabController,
                        labelStyle: TextStyle(color: Colors.black),
                        unselectedLabelColor: Colors.black,
                        labelColor: Colors.blue,
                        tabs: List.generate(
                          20,
                          (index) {
                            return Tab(
                              text: "Tab $index",
                            );
                          },
                        ),
                      ),
                    ),
                    IconButton(
                      icon: Icon(Icons.arrow_forward_ios),
                      onPressed: () {
                        if (_tabController.index + 1 < 20) {
                          _tabController.animateTo(_tabController.index + 1);
                        } else {
                          Scaffold.of(context).showSnackBar(SnackBar(
                            content: Text("Can't move forward"),
                          ));
                        }
                      },
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ],
    );
  }
}

class NewEntryPage扩展StatefulWidget{
@凌驾
State createState()=>NewEntryPageState();
}
类NewEntryPageState扩展了状态
使用SingleTickerProviderStateMixin{
最终列表myTabs=[
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
选项卡(文本:“bro”),
];
TabController\u TabController;
@凌驾
void initState(){
super.initState();
_tabController=tabController(vsync:this,length:myTabs.length);
}
@凌驾
无效处置(){
_tabController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
double width=MediaQuery.of(context).size.width;
返回列(
儿童:[
容器(
边缘:边缘组。对称(垂直:20.0),
填充:常数边集全部(10.0),
颜色:颜色,白色,
子:列(
儿童:[
容器(
孩子:排(
儿童:[
图标按钮(
图标:图标(图标、箭头、背面),
已按下:(){
如果(_tabController.index>0){
_tabController.animateTo(_tabController.index-1);
}否则{
Scaffold.of(上下文).showSnackBar(SnackBar(
内容:文本(“无法返回”),
));
}
},
),
扩大(
孩子:TabBar(
isScrollable:是的,
控制器:\ tab控制器,
标签样式:文本样式(颜色:Colors.black),
未选择的标签颜色:Colors.black,
labelColor:Colors.blue,
选项卡:List.generate(
20,
(索引){
返回选项卡(
文本:“Tab$index”,
);
},
),
),
),
图标按钮(
图标:图标(图标。箭头\前进\ ios),
已按下:(){
如果(_tabController.index+1<20){
_tabController.animateTo(_tabController.index+1);
}否则{
Scaffold.of(上下文).showSnackBar(SnackBar(
内容:文本(“无法前进”),
));
}
},
),
],
),
),
],
),
),
],
);
}
}
这就是代码的作用


在“背面”和“下一步”按钮上,您正在更新选项卡控制器的值。您应该创建一个可滚动的选项卡列表,并让按钮更新ScrollController状态,而不是TabController。TabController正在更新当前选择的选项卡以及滚动位置。请您在手上放一点灰尘,并用一些代码提供答案,如果最后一个选项卡(项目)是视图中的一半,我希望在单击“下一步”或“上一步”按钮@Apealed时,它是第一个完全可见的选项卡