「XDプラグインでDart言語自動生成してみた」 ~私文男子の格闘第3話~

#はじめに
(2020/5/6投稿)
オンライン授業にも慣れ、もうずっとオンラインでいいよとすら思っている私文男子です。

本日はいつも私が使っている**Adobe XDから、自動的にコードの生成をする**ということをやっていきたいと思います。

私がモバイルアプリエンジニアを始めようなった時にFlutterを選んだ理由でもあるので、とてもワクワクしながら作業していました。今までプログラム系統を触ったことがなくてもめちゃくちゃ簡単にできてかつ**衝撃が大きい**作業だったので是非ご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/c6246f15-19d4-2d68-730d-52966f58b354.png)


#環境紹介
まずは環境紹介からいきましょう。
###私のPC環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/8dc99d26-a8f3-cd30-b3fc-04a9bf74f2ee.png)

###Adobe XDの環境
####ソフト自体のバージョン
Adobe XD ver27.2.12.4
Creative Cloud Sync4.3.36.1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/923ab177-4eed-876c-48c1-92223300c66b.png)

####プラグインのバージョン
Xd to Flutter 2.1.0

###Flutterのバージョン
Flutter for Mac OS ver1.12.13

#それではいざ！
それでは実際にXDで作ったプロトタイプをDart言語のコードにしていきましょう。

###手順1 「XDを起動しプラグインを追加」

####手順1-1「ファイルを作成」
まずは、XDを立ち上げ、ファイルを作ります。
私が持っているのはiPhone8なのでiPhone8の大きさで作れるファイルを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/f8c330fb-e828-3a6f-5dd5-bcc5e4fdf13a.png)

####手順1-2「プラグインをXDにインストール」
次にプラグインを下記のURLからインストールします。

まずはこのリンクに飛んでみてください。
https://github.com/thize/xd-to-flutter/releases

リンク先の.xdxで終わるファイルをインストールします。これが「XD to Flutter」というプラグインです。
プラグインとは、「拡張機能」のことで、XDからDart言語へコードを自動生成するという機能はもともとのXDには入っていないので、そのためのインストールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/f45e884c-cb4c-a940-f520-e86ffa5a7755.png)

インストールが無事完了すると、「XDのプラグインがインストールされました」という旨のポップアップが出てきます(スクショし忘れた...)

余談ですがGithubから行かずともXD上からプラグインを検索して追加することもできます。その場合バージョンが少し古いものになるようなので、ご注意ください。

####手順1-3「プラグインが追加されているか確認」
インストールが終わったら、XDに戻り
「プラグイン」
↓
「プラグインを管理」を押して、以下のように「インストール済み」と表示されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/6a88c54e-8596-c4d0-62ad-02617f17ebd5.png)

###手順2 「コードを自動生成」
いよいよきました。ドキドキの瞬間です。簡単な画面を作って、コードにしたいと思います。

####手順2-1「XDに画面を描く」
まずはコードにしたい画面を普通にGUIで作ってみます。
今回は簡単にできるようにTwitterのヘッダーとフッターをそれとなく真似してみました。
XDの扱い方なども今後紹介できたらなと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/befac131-7138-5d0e-1be4-625eccc771ca.png)

テキストが自動生成されてどんな感じに表せるかも気になったのでテキストデータも画面に組み込んでみました。

####手順2-2「プラグインをアクティブにする」
このままでは使えないのでプラグインをツールバー部分に表示させます。
「プラグイン」
↓
「XD to Flutter」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/0c2aab4b-b633-39a0-63bd-797a0dc299f3.png)

選択をするとツールバー部分にXD to Flutterのメニューが表示されます。これでこのステップは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/decc32c3-43b1-90ca-69cb-ec50398f440c.png)

####手順2-3「生成」
いよいよ(早くも？)きました。衝撃の瞬間です。
まずは、画面を選択。
選択をすると「Generate」ボタンが変色するのでポチッとすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/1078e4b3-c0e6-17ac-f610-66442080c218.png)

はい！出ました！「Copied to clip board」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629658/d0d9ca18-47fc-2701-3a93-f6cfefb1e5fb.png)

これで自動生成ができたようです。あまりにも一瞬の出来事すぎて疑いつつもクリップボードの中身を確認すると、、、

```dart
Stack(children:<Widget>[
    Container(
      width: 375,
       height: 667,
       color: const Color(0xffffffff),
       child:
    Container(
      width: 375,
       height: 667,
       color: const Color(0xff11171e),
       child:Column(children:<Widget>[
    Container(
      width: 375,
       height: 242,
       color: const Color(0xff151f2b),
       child:SvgPicture.asset(
      'assets/Icon awesome-twitter.svg',
      width: 28,
      height: 22.74,
    ),
    ),
    Container(
      width: 375,
       height: 413,
       color: const Color(0xff151f2b),
       child:Column(children:<Widget>[const Text(
      'Twitterのまね',
      
      style: TextStyle(
      fontFamily: 'Hiragino Kaku Gothic ProN',
      fontSize: 20,
      
      color: Color(0xffffffff),
      
      
    ),
    ),Row(children:<Widget>[SvgPicture.asset(
      'assets/Icon material-home.svg',
      width: 23.89,
      height: 20.31,
    ),SvgPicture.asset(
      'assets/Icon ionic-ios-search.svg',
      width: 21.8,
      height: 21.8,
    ),Column(children:<Widget>[SvgPicture.asset(
      'assets/パス 1.svg',
      width: 17.72,
      height: 14.77,
    ),SvgPicture.asset(
      'assets/パス 2.svg',
      width: 3.41,
      height: 0.98,
    )],),SvgPicture.asset(
      'assets/Icon material-mail-outline.svg',
      width: 22.14,
      height: 17.71,
    )],)],),
    )],),
    ),
    ),
    Container(
      width: 376,
       height: 1,
       color: const Color(0xff596875),
       
    ),
    Container(
      width: 376,
       height: 1,
       color: const Color(0xff596875),
       
    )],)
```

なんとこんな長文のコードが!
めちゃくちゃこれ書くの大変なんだろうなと思いつつ、目が飛び出ました。

#感想・気付き・疑問
今回は、自動生成に取り組んでみました。驚くほど簡単に立派なコードができてとっても満足でした。
気付きとしては、コードが生成されたは良いものの、今度はこれが合っているのかをある程度Dart言語を読めるようになって検証する必要があると思いました。

疑問としては、生成されたコードを如何にして実機に反映させるか、といったことや、どう動かすんだろう、という点があるので次回以降チャレンジして解決していきたいです。

次回は「自動生成されたコードを実機に反映する」にチャレンジしたいと思います。
それではまた！