Flutterユーザーに贈る、Dart言語でハマりがちな問題とその解決法

Dart for Android Devs

shibuya.apk #26
に開催

2018年6月26日、渋谷を中心に活動するAndroidアプリ開発者コミュニティ「Shibuya.apk」が主催するイベント「shibuya.apk #26」が開催されました。Androidの開発に携わる現役エンジニアたちが、企業の垣根を越えて知見を共有します。トークセッション「Dart for Android Devs」に登壇したのは、ssoejima氏。モバイルアプリ開発フレームワークFlutterを使う上でおそらく遭遇するであろうDart言語特有の難所と、その解決方法を伝授します。

スピーカー

Flutterを使う上で学んだDartのこと

ssoejima氏(以下、ssoejima):今日はDartをAndroid開発者向けに話をしたいと思います。Flutterを触ったことがあるという方、どのくらいいらっしゃいますか?

(会場挙手)

けっこういますね。触ったことはないけど興味はある人。

(会場挙手)

やや増えたぐらいですね(笑)。Flutterを始めるにあたって、自分でもいろいろやったんですが、その時にDartの部分で、気持ち悪かったり分からなかったことをまとめたので、発表したいと思います。

Soejimaと申します。DeNAでAndroidエンジニアをやってます。shibuya.apkとFlutter Meetup Tokyoの運営のお手伝いをもらってます。

今日話すのはこれだけです。

それぞれ自分で気持ち悪かった点などを共有します。

その前に、Dartやる時は、Webですぐにコードを実行できる環境があるので、ちょっと試したい時はここでできます。

少しだけJavaScriptのDartの実装が違うので、一番下に書いてある「int x」、数字の扱いが違うので要注意です。intなんですがどちらもdouble扱いなんですよね。

データ型

そして、データ型。基本はこの5つで、前半がプリミティブ型です。

intとdoubleしかありません。たぶんDartでコードを書く一番最初の頃に出会うと思うのは、この4/2とか。

割り算やると、当たり前ですがエラーになります。キャストしてもダメです。では、どうすればいいか。toInt()するしかないんだけど気持ち悪いなと。よく調べたら、チルダを付けるとよいです。これ、きっと出会うと思うので覚えておいてください。

そして、doubleはこんな感じですね。numという、intでもdoubleでもどっちでもいいよという、ちょっといい加減なタイプもあります。これは見たことないんですが、一応存在してます。常にdoubleでもintでも自由に入れ替えられます。

strings。

クオートはSingleでもDoubleでもどっちでもよいです。エスケープなんかしたくない時は、「r\」を付けてください。

これは、Dartのコーディングの時に初めて出会って、「どういうこっちゃ?」と思ったんですけど、基本的にはブランクでもできます。これは、全部同じ出力になります。

補間はKotlinとまったく同じですね。これも調べたら同じでラッキーって感じです。3連クオートもあります。HTMLと親和性があるみたいなので、これも使えます。

boolは、とくになにもないです。Javaと同じで、boolのtrueだけがtrueです。1とかnullとか、 そういうものは使えないということです。

list型。これは自分でコードを書いていて配列が作りたいと思った時に、「なんか配列の情報がぜんぜんないな」と思ったら、listでやってくださいということでした。なので、全部listになります。0スタートで、varを使っていったんデータ入れるとインファレンスで型が付いちゃうんで、一番下のこのlistに2.0とかは入らなくなります。

定数は、「コードによってなんか違うな」と思っていたら、2つ書き方があります。Dartには同じことをやるのに複数の書き方があって、わりと違うので、最初の頃はちょっと悩みます。

mapもだいたい同じです。

Dart 2から「new」を付けなくてよくなっています。今、Android Studioでサンプルコードつくると「new」付いているので、もういらないので消しましょう。5月から確か、……5月かな、DartからDart 2に変わったんで、今は大丈夫です。

mapの定義の仕方は、真ん中のやつが一番よく見ます。key-valueペアでやってます。const化は、listと同じですね。

変数と定数

変数と定数です。

順序があれなんですけど、varで使うか、明示的に型を与えますと。finalとconstが混ざっているので「何だろうな?」と思ったら、constのほうはコンパイル時に値が付いてないといけないってことですね。finalは動的にコンストラクターとかで付けるかたちです。

コードを見てると、「やたらアンダースコアが付いてるな」と思ったら、アンダースコア付けるとprivate扱いになります。メソッドも同じです。

制御文

制御文です。

言語が変わるとここも変わることが多いので、ちょっと調べたらJavaと同じでした。なので、とくに気にすることもないと思いますけど。break、continueとかも使えます。逆に言うと、switchにbreak入れなきゃいけないので、ちょっと面倒くさいですね。

forEachだけがちょっと違っています。

これはこういう書き方すると覚えるしかないんですけど、ファットアローでやるやつですね。式の時だけは、1行で書くことができます。

複雑なステートメントになると外に出さなきゃいけなくて、関数をつくって関数名を渡すとよきにやってくれます。

例外処理

例外です。

「これもJavaと同じかな」と思って書いたらダメだったので調べたら、try onというのがあって、クラス名を指定する時はonの後に、「try 〇〇 on index error」みたいなもの付けるようになっています。それ以外はtry catchで全部補足することができます。

どんな感じかというと、これですね。

ちょっとだけスッキリしてますよね、Javaに比べて。中の例外のインスタンスを見たい時は、catchを付ければちゃんと取れます。

「なんかわからん」と、たまにCrashlyticsで、3人ぐらい訳のわからんExceptionが出てるという人は、catchで良きに計らってあげてください。内容は同じです。

クラス

クラスなんですが、パッと見た感じJavaと同じですね。

インスタンスのつくり方も同じです。ただ、getterとかsetterっていうのは裏で暗黙的につくられるので、.ageとかこんな感じでアクセスすることができます。

でも、実はコンストラクタですが、基本的に書き方はこっちです。

「this.名前」と書くと自動的に埋めてくれます。なので、これ以外ほとんど見ることはありません。最初に見た時に、コンストラクタってだいたいわかるんですけど、後で説明しますが、また、違うパターンも出てくるので。

Named Constructorというのがあって、名前の付いたコンストラクタで、これは適当につくった「AndroidEvent」というやつなんですが、タイトルと日付の2つを取ります。

「ShibuyaApk」というのを渡して取るよりも、このコンストラクタ自体に名前を付けてつくったほうがよいです。「staticメソッドかな」と最初思ったんですが、調べてみたらこんな感じでした。

そして、Namedよりもよく見るのが、こっちのFactory Constructorです。

さっきのNamedの頭にFactoryが付いただけのように見えますが、実際には、自分で中にインスタナスをつくって返さないといけません。「fromJson」と書いてありますが、Jsonでパーシングするときはよく使います。

Inheritance。これも書き方がわかんなかったので、こんな感じで書きました。

関数

関数ですが、これもJavaとほとんど同じです。

上のやつとか、ほぼ同じですよね。ただ、これも中身が式だけのやつ、Expressionだけのやつは、イカでいけます。何て言うんですかね、これ。ファットアローって個人的には呼んでるんですけど、イカですよね。わかんないけど(笑)。日本語名がわからない(笑)。

(会場笑)

Javaだとgetter、setterって聞いたら、get nameとかset nameですよね。

Dartはsetとgetに分かれていると思うんですが、こうすることによってプロパティのエイリアスみたいなものがつくれます。getのほうは、そのままですよね。この2つをこんな感じで定義すると、「catName=」。要はするにカッコでやらなくてよくなります。そしてgetで直接抜くと、(デフォルトの)getとは違う風に出力することができます。いくらでも定義できて、「可読性が」とか言っていますが、「どうなんだろうな」って個人的には思います。

そして、デフォルトパラメータ。

これはKotlinと同じですよね。これはまあ、よいです。そして、名前付きパラメータ。これは先ほどコンストラクタのところにもあったんですが、複数入れて{}で囲むと、Kotlinのように扱えます。なので、どちらか1つを使いたい時は、名前を付けてやってください。ただ、必ず名前が必要です。そして、全部囲まなくても、1つだけでも大丈夫です。

そして、日本語名がわからなかったのでカタカナにしたんですが、これはちょっとわかりにくかったです。何かというと、last、firstみたいに名前を付けるんですが、lastを付けてfirstはOKなんですよね。ただ、lastとmiddleだけはダメという制限を、これで付けています。

どうやって付けているかというと、[]で囲った部分は、middleを付けたら必ずその前のやつは付けなきゃいけないと、そういう制限が付けられます。下にa、b、c、d、eって適当に書いたんですが、ここで言うと、dをセットしたかったら、a、b、cは必須になると、そういうパラメータの設定の仕方もできます。

Flutterをやっていると独自のクラスの扱い方、とくにレイアウトを覚えないといけないんですが、それやっている時に必ずこういったDartで書くので、たぶん出会うんじゃないかなと思います。ありがとうございました。

(会場拍手)

Occurred on , Published at

スピーカーをフォロー

関連タグ

人気ログ

人気スピーカー

人気コミュニティ

ピックアップ

編集部のオススメ

ログミーTechをフォローして最新情報をチェックしよう!

人気ログ

人気スピーカー

人気コミュニティ

ピックアップ

編集部のオススメ

そのイベント、ログしないなんて
もったいない!
苦労して企画や集客したイベント「その場限り」になっていませんか?