Slide 1

Slide 1 text

DartとFlutterで アプリ開発 宮城アプリ開発勉強会 2019/07/05

Slide 2

Slide 2 text

⾃⼰紹介 ๏ 佐藤健(さとうけん) • フリーランスのプログラマ ๏ ⾔語 • Flash/ActionScript • TypeScript ๏ 趣味 • スラックライン(楽しいよ) • トランポリン(ハマるよ)

Slide 3

Slide 3 text

Dart? JavaScriptの代替になりたかった プログラミング⾔語

Slide 4

Slide 4 text

Flutter? iOS/Androidアプリ開発の Dart⽤フレームワーク

Slide 5

Slide 5 text

Dart、誕⽣ ๏ Googleが開発 ๏ 2011年初公開 • JavaScriptの代替として新規開発 • DartVMで動作する • DartVMはいずれChromeに統合される • …はずだったのだが…

Slide 6

Slide 6 text

Dart、⽅向転換 ๏ 2015年 DartVMのChrome統合を断念 • JavaScriptへコンパイルする形へ ๏ 2017年 TypeScriptがGoogle社内標準⾔語に Ͳ͏ߟ͑ͯ΋ɺ
 %BSUɺ͜ͷ··ফ͑ΔͩΖɻɻɻ

Slide 7

Slide 7 text

๏ 2018年2⽉ 突然の再起動 • 22⽇ Dart2の発表 • 27⽇ Flutter(Beta)の発表 ๏ 2018年12⽉ • 4⽇ Flutter1.0 リリース ๏ 2019年7⽉現在 • Dart2.4.0(2019-06-27) • Flutter 1.5.4-hotfix.2 • 開発版は1.7.11が最新 Dart、再起動 ٸʹ׆ൃʹͳͬͨʜ

Slide 8

Slide 8 text

๏ Androidアプリが作れる ๏ iOSアプリが作れる ๏ 同じソースコードで両⽅作れる • iOSっぽいUIパーツも⽤意されている Flutter、概要 ಉ͡ιʔείʔυͰ࡞ΕΔΑɻ ΋ͪΖΜͦΕͳΓͷखؒ͸ඞཁ͚ͩͲͶɻ w w w

Slide 9

Slide 9 text

Flutter、余談 ๏ Fuchsia(フクシア、フクシャ、フューシャ) • Googleが開発中の新しいOS(謎) • UIとアプリはDart/Flutterで作成

Slide 10

Slide 10 text

Dart/Flutter、開発環境 ๏ Dartを試すだけなら • https://dartpad.dartlang.org/ ๏ きちんと環境を構築するなら • AndroidStudio もしくは VSCode • https://flutter.dev/ • 「Get Started」の通り
 1.FlutterSDKを落としてパス通す
 2.flutter doctorコマンドの⾔う事聞く

Slide 11

Slide 11 text

Dart/Flutter Don't Think. Feel.

Slide 12

Slide 12 text

Flutter、画⾯構築 ๏ 画⾯の全てはWidget ๏ Widgetは基本的には2種類 • StatelessWidget • StatefulWidget ๏ 全てのWidgetは上記2種の継承クラス

Slide 13

Slide 13 text

サンプルコード import 'package:flutter/material.dart'; void main() { return runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello World App'), ), body: Center( child: Text( 'Hello World', style: TextStyle( color: Colors.green, fontSize: 90, ), ), ), ), ); } }

Slide 14

Slide 14 text

サンプルコード(1) import 'package:flutter/material.dart'; void main() { return runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return (লུ) } } ๏ main関数が最初に呼ばれる ๏ ‘new’は省略可能 ๏ runApp関数にWidgetのインスタンスを渡す ๏ アプリルートのWidgetに

Slide 15

Slide 15 text

サンプルコード(2) class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Hello World App'), ), body: (লུ) ), ); } } ๏ MaterialAppWidget ๏ ScaffoldWidget ๏ AppBarWidget ๏ TextWidget

Slide 16

Slide 16 text

サンプルコード(3) class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: (লུ), body: Center( child: Text( 'Hello World', style: TextStyle( color: Colors.green, fontSize: 90, ), ), ), ), ); } }

Slide 17

Slide 17 text

レイアウト(配置の調整) Center( child: Text( 'Hello World', style: TextStyle((লུ)), ), ) Align( alignment: Alignment.bottomRight, child: Text( 'Hello World', style: TextStyle((লུ)), ), )

Slide 18

Slide 18 text

レイアウト(縦に並べる) Center( child: Text( 'Hello World', style: TextStyle((লུ)), ), ) Column( children: [ Text( 'Hello World', style: TextStyle((লུ)), ), Text( 'Hello World', style: TextStyle((লུ)), ), ], ),

Slide 19

Slide 19 text

レイアウト(横に並べる) Center( child: Text( 'Hello World', style: TextStyle((লུ)), ), ) Row( children: [ Text( 'Hello World', style: TextStyle((লུ)), ), Text( 'Hello World', style: TextStyle((লུ)), ), ], ),

Slide 20

Slide 20 text

画像を表⽰ Center( child: Image.network( 'http://jinten.net/logo.jpg', ), )

Slide 21

Slide 21 text

ボタン Center( child: RaisedButton( child: Text( 'Ϙλϯ', style: TextStyle(fontSize: 20), ), onPressed: () { print('Button pressed!!'); }, ), ),

Slide 22

Slide 22 text

ダイアログ onPressed: () { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text('λΠτϧ'), content: Text('ຊจຊจຊจຊจ'), actions: [ FlatButton( child: Text('Cancel'), onPressed: () {}, ), FlatButton( child: Text('OK'), onPressed: () {}, ), ], ); }, ); },

Slide 23

Slide 23 text

ダイアログ(iOS⾵) onPressed: () { showDialog( context: context, builder: (BuildContext context) { return CupertinoAlertDialog( title: Text('λΠτϧ'), content: Text('ຊจຊจຊจຊจ'), actions: [ CupertinoButton( child: Text('Cancel'), onPressed: () {}, ), CupertinoButton( child: Text('OK'), onPressed: () {}, ), ], ); }, ); },

Slide 24

Slide 24 text

Dartパッケージの追加 ๏ https://pub.dev

Slide 25

Slide 25 text

Dart/Flutterの 良い所・悪い所

Slide 26

Slide 26 text

良い! ๏ 並べる系レイアウトなら⾮常に簡単 ๏ よくあるUIパーツなら⽤意されてる • pub.dev探せばそこそこのモノは⾒つかる ๏ Googleが開発している • Googleサービス/プロダクトとの⾼い親和性 • firebaseとか ๏ (少なくとも今は)とても活発 ๏ AndroidとiOSのどちらにも対応できる • 将来的にはWeb, Desktop, RaspberryPi, 他 w w (PPE

Slide 27

Slide 27 text

悪い… ๏ ⾃由なレイアウトには対応しづらい • ゲームとか ๏ まだまだ新しい • 情報が少ない • 知名度が低い ๏ 「AndroidとiOSをワンソースで」の暴⾛ ๏ iOS⾵のUIという罠 ๏ ネストが深くなりがち ๏ スタンダートな設計などが確⽴されていない w #BE

Slide 28

Slide 28 text

まとめ %BSU'MVUUFS͸ɺ ࠓɺ·͞ʹա౉ظʹ͋Δͷͩʂ ৽͍͠Ϟϊ޷͖ͳΒ ৮ͬͯΈΔՁ஋ΞϦʂ