Flutter画面遷移の実装(初心者向け)

# はじめに
この記事はFlutter初心者のためのものです。
今回は画面遷移を実装するまでを解説します。
実装方法としてボタンを押したら画面遷移するという方法で実装します。

# １. 準備
アンドロイドスタジオを開きflatterの新規プロジェクトを始めましょう。すると、デフォルトで開かれる「main.dart」にコードが書かれていると思います。一旦この状態でビルドしてみると下のスクリーンショットの画面が出てきてボタンを押した回数カウントされていくというプログラムになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468822/47734d8f-83aa-a39c-3ea0-9ffca98aa44c.png)
せっかくここで色々とコードが書かれているので利用しますが、メッセージやボタンを押して加算するプログラムは不要なので削除します。また、コメント文も多くありますが分かりにくいので削除しましょう。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
      ),
    );
  }
}
```
コメント文が消えて見やすくなりましたね。このようにすれば先ほどのボタンや数値、メッセージが消えシンプルな見た目のアプリとなります。

#2. 新たな画面の追加
ここで本当に軽くflutterのファイル構成について触れます。以下の画像のように、プロジェクトを作ると「lib」というフォルダの中に「mein.dart」が入っています。基本的にアプリケーションの画面はこの「lib」というフォルダの中に入れておくと覚えておけば大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468822/0aeb444c-1e5c-adda-9c3d-941d15560605.png)
ということで、このフォルダの中に新たなdartファイルを追加しましょう。libを右クリック＞New>Dart File と選択し、名付ければ追加されます。とりあえず私は「next.dart」としました。
新たなファイルができましたが、何も書かれていないため必要最低限のプログラムを書いていきます。

```Dart:next.dart
class Next extends StatelessWidget{
}
```
このように書くと勝手にimport文が書かれ、以下のようになります。

```Dart:next.dart
import 'package:flutter/cupertino.dart';

class Next extends StatelessWidget{
}
```
すると、クラス名の所に赤の波線が引かれます。クラス名にカーソルを合わせ、出現した赤の！マークを押し、一番上にある「Cleate 1 missing ~」を選択すると自動でコードが入力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468822/c75b2964-b468-f361-da54-421d861288a0.png)
このコードを利用して以下のようにコードを書くことでとりあえず遷移先の完成です。

```Dart:next.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class Next extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title:Text('2画面目'),
      ),
      body: Center(
        
      ),
    );
  }
}
```

#3. 画面遷移の実装
それではいよいよ、「main.dart」から「next.dart」に画面遷移するためのプログラムを書きます。
今回の画面遷移の実装方法として、ボタンを用意し、押されたら画面を遷移します。
「main.dart」の「_MyHomePageState」クラスの中のbodyの中にプログラムを書いていきます。また、この編集に伴ってヘッダーの文字を変えました。

```Dart:main.dart
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('1画面目'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('次へ'),
          onPressed: (){
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => Next(),
              ),
            );
          }
        ),
      ),
    );
  }
}
```
ここでのRaisedButtonによりボタンが作られます。
onPreasedにより押された時の処理を書くため、ここで遷移先のクラス名を書くことになります。

ここで再びRunしてみましょう
![flutter動作1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468822/9d7372b5-ad42-c017-7720-4b3e41b56ab5.gif)
無事問題なく画面遷移が実装できました。
画面遷移のプログラムを書くと、遷移先の画面のヘッダーに自動で前の画面に戻るボタンができます。

最後に画面遷移先にも戻るボタンを作ってみましょう。

```Dart:next.dart
class Next extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title:Text('2画面目'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('戻る'),
          onPressed: (){
            Navigator.pop(context);
          },
        ),
      ),
    );
  }
}
```
先ほどの「main.dart」に画面遷移ボタンを実装した時と似てますね。
しかし、こちらでは遷移された画面に戻るというプログラムを書いているため、遷移先のクラス名を指定する必要がありません。
これで一通りの画面遷移実装は完了です。