フラッターでは、タブレイアウトを簡単に実装できます。これは公式の documentation からの簡単な例です:
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),
],
),
),
),
);
}
}
しかし、ここにあるのは、アクティブなタブインデックスを取得して、特定のタブにロジックを適用できるようにすることです。ドキュメントを検索しましたが、理解できませんでした。助けてくれますか?
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(),
),
);
}
}
この場合、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...
})
]
)
TabBarのonTapイベントによってタブが選択されると、現在のインデックスにアクセスできます。
TabBar(
onTap: (index) {
//your currently selected index
},
tabs: [
Tab1(),
Tab2(),
]);
TabControllerにリスナーを適用するだけです。
// within your initState() method
_tabController.addListener(_setActiveTabIndex);
void _setActiveTabIndex() {
_activeTabIndex = _tabController.index;
}
RémiRousseletの例のおかげで、次のようなコードを実行できます。
_tabController.index
これは、TabBarViewの位置の現在のインデックスを返します