SlideShare a Scribd company logo
1 of 14
オレの考えたeffective-flutter
2019/11/22 sh-ogawa
最近Dartの気持ちが判ってきたような
気がする(多分気のせい)
最近Flutterの気持ちが判ってきたような
気がする(多分気のせい)
基本
● アプリの表現はページの組合せ
● StatefulWidgetの利用は最小限
● Navigatorは上手く使う
● PluginでOS差分を外に追いやる
● 腐敗防止層を置く
4. エントリのファイル名を決めておく
ページの組合せ
1. 各ページを個別に作成
2. これらをコントロールするWidget
3. 単純なものは1つで構わない
StatefulWidget
● 何も考えないと画面全体がrebuild対象
● StatefulWidgetの配置場所を考える
● Blocパターンを使う
Blocパターンおさらい
● StreamBuilderを使う
● 入力をStreamで流して、更新させる
● RxDartを使うと簡単にできる
StreamBuilder
https://api.flutter.dev/flutter/widgets/StreamBuilder-class.html
Navigatorの使い方
● 画面をpush/popで切替えられる
● 安易に使うとappbarのleadingで苦しむ
● PageViewやIndexedStackを使う
● 履歴から削除しながら画面遷移させる
Navigator.pushNamedAndRemoveUntil(
context, routeName,
(Route<dynamic> route) => false
);
Plugin化の考え方
● OSの機能を使わないといけない
● 充分に抽象化されている
※業務ロジックが入り込まない
● パッケージが公開されてたら使うだろってものは公開す
る
※音を鳴らしたい、音量を変えたいとかそういうもの
● 機能は詰め込み過ぎない
※単一責任の原則に従う
Pluginの取り込み
● バイナリでは落ちてこない
● コンパイルしている
● プラグインを大量に取込んでも、サイズ的に
は対して変わらない(であろう)
● 処理は所詮ローカル呼び出し
腐敗防止層
● Flutterに限った話ではない
● バックエンドとフロントのギャップを埋める
● あとMapは使いづらい
var _card = Card(
child: ListTile(
title: Text(map[‘title’]),
trailing: IconButton(
icon: Icon(Icons.arrow_forward_ios),
onPressed: () {
callback(map[‘value’]);
},
),
),
var _card = Card(
child: ListTile(
title: Text(entity.title),
trailing: IconButton(
icon: Icon(Icons.arrow_forward_ios),
onPressed: () {
callback(entity.value);
},
),
),
);
JSON to Entity on dart
● json_annotationを使う
● Javaのjsonicとほぼ同等
● アノテーションでプロパティとMapのキー
を紐づけて、リフレクションで箱クラスの実
態を作る
● 対象が変更される度に叩く
チームで使う場合はgit hookで叩かせる
flutter packages pub run build_runner build
その他(Dart)
● 1ファイルがpackage friendlyと考える
ex) request/response/convert to
Entity
● 名前付きコンストラクタを積極的に使う
● メソッド引数は名前付き引数を使う
● 必須にパラメータには@requiredを付ける
おしまい

More Related Content

What's hot

Product Release Webinar - APIM Manager 1.6
Product Release Webinar - APIM Manager 1.6Product Release Webinar - APIM Manager 1.6
Product Release Webinar - APIM Manager 1.6
WSO2
 

What's hot (17)

Goを知る
Goを知るGoを知る
Goを知る
 
BuddyPressの導入からカスタマイズまでの日記
BuddyPressの導入からカスタマイズまでの日記BuddyPressの導入からカスタマイズまでの日記
BuddyPressの導入からカスタマイズまでの日記
 
Fuchsia概略その1
Fuchsia概略その1Fuchsia概略その1
Fuchsia概略その1
 
GroovyのJSONで日付・時刻を扱う
GroovyのJSONで日付・時刻を扱うGroovyのJSONで日付・時刻を扱う
GroovyのJSONで日付・時刻を扱う
 
Groovyスクリプト"再"入門 起動編
Groovyスクリプト"再"入門 起動編Groovyスクリプト"再"入門 起動編
Groovyスクリプト"再"入門 起動編
 
今から始めるApache Groovy
今から始めるApache Groovy今から始めるApache Groovy
今から始めるApache Groovy
 
Androidの新ビルドシステム
Androidの新ビルドシステムAndroidの新ビルドシステム
Androidの新ビルドシステム
 
GroovyでJSON2015
GroovyでJSON2015GroovyでJSON2015
GroovyでJSON2015
 
Androidの忌しきStackOverFlowをどうにかする
Androidの忌しきStackOverFlowをどうにかするAndroidの忌しきStackOverFlowをどうにかする
Androidの忌しきStackOverFlowをどうにかする
 
今更GWTで遊ぶぜ!
今更GWTで遊ぶぜ!今更GWTで遊ぶぜ!
今更GWTで遊ぶぜ!
 
Ruby - gnuplot on Mac
Ruby - gnuplot on MacRuby - gnuplot on Mac
Ruby - gnuplot on Mac
 
RubyConfの話の続きのおはなし
RubyConfの話の続きのおはなしRubyConfの話の続きのおはなし
RubyConfの話の続きのおはなし
 
Meteorというフレームワーク
MeteorというフレームワークMeteorというフレームワーク
Meteorというフレームワーク
 
Android カスタムROMの作り方
Android カスタムROMの作り方Android カスタムROMの作り方
Android カスタムROMの作り方
 
Product Release Webinar - APIM Manager 1.6
Product Release Webinar - APIM Manager 1.6Product Release Webinar - APIM Manager 1.6
Product Release Webinar - APIM Manager 1.6
 
azure障害は忘れたころにやってくる
azure障害は忘れたころにやってくるazure障害は忘れたころにやってくる
azure障害は忘れたころにやってくる
 
GoでEPC作って本番運用している話
GoでEPC作って本番運用している話GoでEPC作って本番運用している話
GoでEPC作って本番運用している話
 

Similar to Effective flutter

NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
Naruto TAKAHASHI
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman
tomo_masakura
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
 

Similar to Effective flutter (14)

Gruntでjava script前作業の自動化!
Gruntでjava script前作業の自動化!Gruntでjava script前作業の自動化!
Gruntでjava script前作業の自動化!
 
Djangoのススメ
DjangoのススメDjangoのススメ
Djangoのススメ
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman今流行りのウェブアプリ開発環境Yeoman
今流行りのウェブアプリ開発環境Yeoman
 
Jjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxJjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafx
 
WordPress プラグイン Infinite Scroll を試してみた
WordPress プラグイン Infinite Scroll を試してみたWordPress プラグイン Infinite Scroll を試してみた
WordPress プラグイン Infinite Scroll を試してみた
 
HTML5-pronama-study
HTML5-pronama-studyHTML5-pronama-study
HTML5-pronama-study
 
フィルタドライバ入門
フィルタドライバ入門フィルタドライバ入門
フィルタドライバ入門
 
DartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみようDartPad+CodePenで、Flutterを体験してみよう
DartPad+CodePenで、Flutterを体験してみよう
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
デ部会 プロトタイプ
デ部会 プロトタイプデ部会 プロトタイプ
デ部会 プロトタイプ
 
Lt
LtLt
Lt
 
210630 python
210630 python210630 python
210630 python
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 

More from 小川 昌吾

More from 小川 昌吾 (20)

Flutter first impression
Flutter first impressionFlutter first impression
Flutter first impression
 
Flutter management statement
Flutter management statementFlutter management statement
Flutter management statement
 
Laravel vue-project-upload
Laravel vue-project-uploadLaravel vue-project-upload
Laravel vue-project-upload
 
Lara vue
Lara vueLara vue
Lara vue
 
Atomic design+vue
Atomic design+vueAtomic design+vue
Atomic design+vue
 
今年はある意味当たり年だった! という一年振り返り
今年はある意味当たり年だった! という一年振り返り今年はある意味当たり年だった! という一年振り返り
今年はある意味当たり年だった! という一年振り返り
 
Njug docker-20180623
Njug docker-20180623Njug docker-20180623
Njug docker-20180623
 
アプリ屋のための Docker入門
アプリ屋のための Docker入門アプリ屋のための Docker入門
アプリ屋のための Docker入門
 
Njug 20180414
Njug 20180414Njug 20180414
Njug 20180414
 
Java屋からPHPerになって1年くらい経った
Java屋からPHPerになって1年くらい経ったJava屋からPHPerになって1年くらい経った
Java屋からPHPerになって1年くらい経った
 
チュートリアルではじめるVue.js
チュートリアルではじめるVue.jsチュートリアルではじめるVue.js
チュートリアルではじめるVue.js
 
受託、SES、WEBと経験したので比較してみた
受託、SES、WEBと経験したので比較してみた受託、SES、WEBと経験したので比較してみた
受託、SES、WEBと経験したので比較してみた
 
ITの開発現場における最近の当たり前これからの当たり前(主観)
ITの開発現場における最近の当たり前これからの当たり前(主観)ITの開発現場における最近の当たり前これからの当たり前(主観)
ITの開発現場における最近の当たり前これからの当たり前(主観)
 
非エンジニアに捧ぐツアーオブ構成管理
非エンジニアに捧ぐツアーオブ構成管理非エンジニアに捧ぐツアーオブ構成管理
非エンジニアに捧ぐツアーオブ構成管理
 
Dynamo db はじめの一歩
Dynamo db はじめの一歩Dynamo db はじめの一歩
Dynamo db はじめの一歩
 
スキトラGit
スキトラGitスキトラGit
スキトラGit
 
スキトラ Spring + mybatis
スキトラ Spring + mybatisスキトラ Spring + mybatis
スキトラ Spring + mybatis
 
テストコード入門
テストコード入門テストコード入門
テストコード入門
 
IoT検定
IoT検定IoT検定
IoT検定
 
MySQL入門
MySQL入門MySQL入門
MySQL入門
 

Effective flutter

Editor's Notes

  1. ページ全体をコンポーネントとして捉えている 基本はmainから入るが、通知から表示するときはdetailを直接開く、ということができる エントリのファイル名を決めておくと、 後で見るときにどこからおえば良いかが判りやすい またmainを置くことで、配下に置くページWidgetに対して、ChangeNotifierで制御しやすくなる
  2. setStateは発行したWidgetとそこにぶら下がっているWidgetがrebuildされる StatefulWidgetの配置を考慮した構成は、スキル差が諸に出る 何も考えないで基本系をStatelessWidgetにして、Blocで更新したい箇所を更新するのがコスパが良い
  3. ページをmainでひとまとまりにする
  4. どっちが良いかという話。 左はキーの値が変わると全部変わる。 右は詰め込むときにアプリの形に合わせるように入れれば良いから、変更箇所が最小限になる。
  5. コマンドは、環境ごとに叩かないと上手く動かないことを観測しているので、 Gitignoreに自動生成ファイルは入れて管理外にする。 Git hookでpull/merge/checkoutしたときくらいに走るようにしとくとスムーズ