Flutterを使った画面遷移の覚書です。サンプルソースはcookbookより引用しています。
目次
概要
Flutterでは「Route」にてルーティングを定義し「Navigator」によりRouteを切り替えるという流れになります。
タクシー(Flutter)に乗ったら目的地(Route)を伝えると運転手さん(Navigator)が送り届けてくれる(画面遷移)って感じでしょうか。
次画面遷移[push:進む]
画面1から画面2への次画面遷移(進む)について記載します。
事前にrouteを定義する方法
void main() { runApp(MaterialApp( title: 'サンプル1', initialRoute: '/', routes: { '/': (context) => FirstScreen(), '/second': (context) => SecondScreen(), }, )); }
class FirstScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('画面1'), ), body: Center( child: RaisedButton( child: Text('画面2へ進む'), onPressed: () { // 画面遷移 Navigator.pushNamed(context, '/second'); }, ), ), ); } }
class SecondScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('画面2'), ), body: Center( child: RaisedButton( onPressed: () { // 画面遷移 Navigator.pop(context); }, child: Text('画面1へ戻る'), ), ), ); } }
main()にてルーティングを定義します。次画面(SecondScreen)を「'/second': (context) => SecondScreen()」として定義しています。
ボタンが押されたとき(onPressed)に、次画面遷移(Navigator.push)します。Navigatorには先に定義した'/second'を渡します。
事前にrouteを定義しない方法
void main() { runApp(MaterialApp( title: 'サンプル2', home: FirstRoute(), )); }
class FirstRoute extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('画面1'), ), body: Center( child: RaisedButton( child: Text('画面2へ進む'), onPressed: () { // 画面遷移 Navigator.push( context, MaterialPageRoute(builder: (context) => SecondRoute()), ); }, ), ), ); } }
class SecondRoute extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("画面2"), ), body: Center( child: RaisedButton( onPressed: () { // 画面遷移 Navigator.pop(context); }, child: Text('画面1へ戻る'), ), ), ); } }
先ほど同様、ボタンが押されたとき(onPressed)に、次画面遷移(Navigator.push)します。事前にルーティングを定義していないので直接指定します。
MaterialPageRouteはCupertinoPageRouteと置き換えることでiOS風の画面遷移(スワイプで横に画面をめくるアニメーション)となります。MaterialPageRouteの場合は縦方向のアニメーションとなります。
・MaterialPageRoute
・CupertinoPageRoute
前画面遷移[pop:戻る]
画面2から画面1への前画面遷移(戻る)について記載します。
void main() { runApp(MaterialApp( title: 'サンプル2', home: FirstRoute(), )); }
class SecondRoute extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("画面2"), ), body: Center( child: RaisedButton( onPressed: () { // 画面遷移 Navigator.pop(context); }, child: Text('画面1へ戻る'), ), ), ); } }
class FirstRoute extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('画面1'), ), body: Center( child: RaisedButton( child: Text('画面2へ進む'), onPressed: () { // 画面遷移 Navigator.push( context, MaterialPageRoute(builder: (context) => SecondRoute()), ); }, ), ), ); } }
ボタンが押されたとき(onPressed)に、前画面遷移(Navigator.pop)します。
「←」ボタンは自動挿入され、Backボタンの役割を果たします。