Je crée une application qui contient une barre d'onglets sur sa page d'accueil. Je veux être capable de naviguer à l'un des onglets tiliser mon FloatingActionButton
. De plus, je souhaite conserver les méthodes de navigation par défaut vers cet onglet, c’est-à-dire en balayant à l’écran ou en cliquant sur l’onglet.
Je veux aussi savoir comment lier cet onglet à un autre bouton.
Voici une capture d'écran de ma page d'accueil.
Vous devez obtenir le contrôleur TabBar
et appeler sa méthode animateTo()
à partir du bouton onPressed()
handle.
import 'package:flutter/material.Dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
home: new MyTabbedPage(),
);
}
}
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(
title: new Text("Tab demo"),
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(),
),
floatingActionButton: new FloatingActionButton(
onPressed: () => _tabController.animateTo((_tabController.index + 1) % 2), // Switch tabs
child: new Icon(Icons.swap_horiz),
),
);
}
}
Si vous utilisez un GlobalKey
pour le MyTabbedPageState
, vous pouvez obtenir le contrôleur de n’importe où, vous pouvez donc appeler la animateTo()
de n’importe quel bouton.
class MyApp extends StatelessWidget {
static final _myTabbedPageKey = new GlobalKey<_MyTabbedPageState>();
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
home: new MyTabbedPage(
key: _myTabbedPageKey,
),
);
}
}
Vous pouvez l'appeler de n'importe où en faisant:
MyApp._myTabbedPageKey.currentState._tabController.animateTo(...);
Si vous souhaitez accéder à une page spécifique, vous pouvez utiliser
PageController.jumpToPage(int)
Cependant, si vous avez besoin d'animation, vous utiliserez
PageController.animateToPage(page, duration: duration, curve: curve)
Exemple simple le démontrant.
// create a PageController
final _controller = PageController();
bool _shouldAnimate = true; // whether we animate or jump
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
floatingActionButton: FloatingActionButton(
onPressed: () {
if (_shouldAnimate) {
// animates to page1 with animation
_controller.animateToPage(1, duration: Duration(seconds: 1), curve: Curves.easeOut);
} else {
// jump to page1 without animation
_controller.jumpToPage(1);
}
},
),
body: PageView(
controller: _controller, // assign it to PageView
children: <Widget>[
FlutterLogo(colors: Colors.orange), // page0
FlutterLogo(colors: Colors.green), // page1
FlutterLogo(colors: Colors.red), // page2
],
),
);
}