[Flutter]画面遷移サンプル

#画面遷移サンプル
flutterで「あれ？どうやるんだっけ？」となった際に（自分が）チラ見するためのメモです。
（決して良いコードではないので、見てしまった方はご注意ください）

##単純な画面遷移
```dart:main.dart
import 'package:flutter/material.dart';

main() {
  runApp(MaterialApp(
    home: Page1(),
  ));
}

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page1'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('go!'),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => Page2()),//Page2へ遷移させる
            );
          },
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page2'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('back!'),
          onPressed: () {
            Navigator.pop(context);//前の画面に戻る
          },
        ),
      ),
    );
  }
}

```

##名前付きルートを定義して遷移させる場合

画面が増えてくると同じ様な処理を大量に書くハメになるので、
名前付きルートで遷移させるのが便利。

MaterialAppを以下の様に修正する。

- initialRouteプロパティを追加
- routesプロパティを追加
- homeプロパティを削除

initialRouteは初期表示にさせたいroutesで定義した名称を設定する。
routesは画面遷移で使用する名称を定義する。
ちなみに**initialRouteとhomeプロパティは同時に使用できない**ため削除する。


```dart:main.dart
main() {
  runApp(MaterialApp(
    initialRoute: '/',
    routes: {
      '/': (context) => Page1(), //追加
      '/page2': (context) => Page2(), //追加
    },
  ));
}
```

Pushの際にroutesで定義した名称を使用する様に修正する。

```dart:main.dart
class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page1'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('To Page2'),
          onPressed: () {
            Navigator.pushNamed(context, '/page2');//routesで定義した名称を指定する
          },
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page2'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('to Page1'),
          onPressed: () {
            Navigator.pop(context); //前の画面に戻る（変更なし）
          },
        ),
      ),
    );
  }
}
```

##次画面に遷移すると同時にデータを渡したい時

```dart:main.dart
import 'package:flutter/material.dart';

main() {
  runApp(MaterialApp(
    home: Page1(),
  ));
}

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page1'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('To Page2'),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => Page2(msg: 'hogehoge')),
            );
          },
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  final String _msg;

  Page2({Key key, @required msg})
      : assert(msg != null),
        this._msg = msg,
        super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page2'),
      ),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            RaisedButton(
              child: Text('to Page1'),
              onPressed: () {
                Navigator.pop(context); //前の画面に戻る（変更なし）
              },
            ),
            Text(_msg),
          ],
        ),
      ),
    );
  }
}

```