Как получить текущий индекс вкладки в Flutter - PullRequest
0 голосов
/ 01 мая 2018

В флаттере реализация макета вкладок проста и понятна. Это простой пример из официальной документации :

import 'package:flutter/material.dart';

void main() {
  runApp(new TabBarDemo());
}

class TabBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new DefaultTabController(
        length: 3,
        child: new Scaffold(
          appBar: new AppBar(
            bottom: new TabBar(
              tabs: [
                new Tab(icon: new Icon(Icons.directions_car)),
                new Tab(icon: new Icon(Icons.directions_transit)),
                new Tab(icon: new Icon(Icons.directions_bike)),
              ],
            ),
            title: new Text('Tabs Demo'),
          ),
          body: new TabBarView(
            children: [
              new Icon(Icons.directions_car),
              new Icon(Icons.directions_transit),
              new Icon(Icons.directions_bike),
            ],
          ),
        ),
      ),
    );
  }
}

Но вот в чем дело, я хочу получить индекс активной вкладки, чтобы я мог применить некоторую логику к определенным вкладкам. Я ищу документацию, но не смог разобраться. Ребята, вы можете помочь и спасибо?

Ответы [ 5 ]

0 голосов
/ 13 июля 2019

Просто примените слушатель к TabController.

// within your initState() method
_tabController.addListener(_setActiveTabIndex);

void _setActiveTabIndex() {
  _activeTabIndex = _tabController.index;
}
0 голосов
/ 10 июля 2019

Вы можете получить доступ к текущему индексу, когда вкладка выбрана событием onTap TabBar.

TabBar(
    onTap: (index) {
      //your currently selected index
    },

    tabs: [
      Tab1(),
      Tab2(),
    ]);
0 голосов
/ 09 февраля 2019

В этом случае использование StatefulWidget и State не очень хорошая идея.

Вы можете получить текущий индекс по DefaultTabController.of(context).index;.

Следуйте по коду:

...
appBar: AppBar(
  bottom: TabBar(
    tabs: [
      Tab(~), Tab(~)
    ]
  ),
  actions: [
    // At here you have to get `context` from Builder.
    // If you are not sure about this, check InheritedWidget document.
    Builder(builder: (context){
      final index = DefaultTabController.of(context).index;   
      // use index at here... 
    })
  ]
)

0 голосов
/ 27 июня 2019

Благодаря примеру Rémi Rousselet, вы можете сделать это, код такой:

_tabController.index

Это вернет текущий индекс позиции вашего TabBarView

0 голосов
/ 01 мая 2018

Весь смысл DefaultTabController в том, что он сам управляет вкладками.

Если вы хотите иметь пользовательское управление вкладками, используйте TabController. С TabController у вас есть доступ к гораздо большей информации, включая текущий индекс.

class MyTabbedPage extends StatefulWidget {
  const MyTabbedPage({Key key}) : super(key: key);
  @override
  _MyTabbedPageState createState() => new _MyTabbedPageState();
}

class _MyTabbedPageState extends State<MyTabbedPage>
    with SingleTickerProviderStateMixin {
  final List<Tab> myTabs = <Tab>[
    new Tab(text: 'LEFT'),
    new Tab(text: 'RIGHT'),
  ];

  TabController _tabController;

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

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

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        bottom: new TabBar(
          controller: _tabController,
          tabs: myTabs,
        ),
      ),
      body: new TabBarView(
        controller: _tabController,
        children: myTabs.map((Tab tab) {
          return new Center(child: new Text(tab.text));
        }).toList(),
      ),
    );
  }
}
...