![ç»å](https://habrastorage.org/getpro/habr/post_images/ff6/2d9/7ef/ff62d97ef8502845942c655e4a1d2ef3.png)
ãåç¥ãããããŸããããFlutterã¯ãåªãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãåããã¯ãã¹ãã©ãããã©ãŒã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ãœãªã¥ãŒã·ã§ã³ã§ãã Flutterãã€ã³ã¿ãŒãã§ã€ã¹èšèšã«äœ¿çšããã¢ãããŒãã¯ãWebã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããã®ãšäŒŒãŠããããããã®ã©ã€ãã©ãªã«æ £ãããšãHTML / CSSãã¯ãããžãŒãšå€ãã®é¡äŒŒç¹ãèŠã€ãããŸãã
ã©ã€ãã©ãªã®äœæè ãFlutterã«ã€ããŠèšã£ãŠããããšãèããšããã®ã©ã€ãã©ãªãç®ã«åªããWebã¢ããªã±ãŒã·ã§ã³ã®éçºãç°¡çŽ åããã¹ããŒãã¢ããããŠããããšãããããŸãã ããèãããŸãããFlutterãæåã«èŠããšãã次ã®ã¯ãã¹ãã©ãããã©ãŒã ãœãªã¥ãŒã·ã§ã³ãç»å Žããçç±ã¯ããããããŸããã§ããã XamarinãPhoneGapãIonicãReact Nativeãªã©ãå€ãã®åæ§ã®ãã¯ãããžãŒããããŸãã ã¯ãã¹ãã©ãããã©ãŒã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããåéã§ã¯ãååãªéžæè¢ããããããŸããŸãªãã¯ãããžãŒã«ã¯é·æãšçæããããšããäºå®ããããŸãã Flutterãä»ã®ç«¶åä»ç€Ÿãšã¯äžç·ãç»ããæ¬åœã«æ°ããèå³æ·±ããã®ãæäŸã§ãããã©ããã¯ããããŸããã§ããã ããããç§ããã©ãã¿ãŒãããããç¥ãããã«ãªã£ããšããé©ããåŸ ã£ãŠããŸããã
Flutterã©ã€ãã©ãªã«ã¯ãAndroidéçºè ã®èŠ³ç¹ããéåžžã«èå³æ·±ãå€ãã®æ©èœããããŸãã ãã®èšäºã§ã¯ããã®ã©ã€ãã©ãªã«ã€ããŠç¹ã«æ°ã«å ¥ã£ãç¹ã«ã€ããŠã話ããããšæããŸãã
ãªãå¥ã®ã¢ãã€ã«SDKãå¿ èŠãªã®ã§ããïŒ
FlutterãæäŸããæ°ããæ©èœããã®ã©ã€ãã©ãªã®ããã¿ã«ã€ããŠçåã«æããããããããŸããã FlutterãReact Nativeãšã©ã®ããã«ç°ãªãããç¥ããããããããŸããã ããã§ã¯ãæ·±ãæè¡çãªãžã£ã³ã°ã«ã«ã¯è§ŠããŸãããããã¯ãã§ã«æžãããŠããããã§ãã èå³ã®ããæ¹ã¯ã ãã¡ããšãã¡ããã芧ãã ãã ã
Flutterã«ã€ããŠç°¡åã«èª¬æãããšããã€ããªããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããSDKããããŸãã ç¹ã«ãããã¯AndroidãšiOSãã©ãããã©ãŒã ã§åãã³ãŒãããŒã¹ã䜿çšã§ããå¯èœæ§ãæå³ããŸãã ã³ãŒãã¯Dartã§æžãããŠããŸããããã¯Googleãéçºããèšèªã§ãJavaãç¥ã£ãŠãã人ã«ã¯éŠŽæã¿ã®ãããã®ã§ãã XMLãã¡ã€ã«ã®ä»£ããã«ã次ã®ãããªããããã¬ã€ã¢ãŠãããªãŒã䜿çšãããŸãã
import 'package:flutter/material.dart'; class HelloFlutter extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: "HelloFlutter", home: new Scaffold( appBar: new AppBar( title: new Text("HelloFlutter"), ), body: new Container( child: new RaisedButton(onPressed: _handleOnPressed), ), ), ); } }
ã芧ã®ãšãããããŒãžã¬ã€ã¢ãŠãã¯åã蟌ã¿ã³ã³ããŒãã³ãïŒãŠã£ãžã§ããïŒããæ§ç¯ãããŠããŸãã ã«ãŒããŠã£ãžã§ããã¯
MaterialApp
ãªããžã§ã¯ãïŒãããã¢ããªã±ãŒã·ã§ã³å šäœïŒã§è¡šãããå éšã«
Scaffold
ãŠã£ãžã§ããïŒã¡ã€ã³ã¬ã€ã¢ãŠãæ§é ïŒãããããã®äžã«
AppBar
ïŒAndroidã®
Toolbar
é¡äŒŒç©ïŒãšããŒãžã®
body
èŠçŽ ãè¡šã
Container
ãŠã£ãžã§ããããããŸãã ããŒãžã®æ¬æå ã«ã¯ãããã¹ãèŠçŽ ããã¿ã³ãªã©ã®ã€ã³ã¿ãŒãã§ãŒã¹èŠçŽ ãè¡šããŠã£ãžã§ããããããŸãã
ããã§ã¯ãããããã¹ãŠãéåžžã«ç°¡æœã«ç€ºããŠããŸãããããã¯ææ°ã®æ å ±ãæäŸããããã§ãã Flutterã䜿çšããã¬ã€ã¢ãŠãã®æ§ç¯ã®è©³çŽ°ã«èå³ãããå Žåã¯ã ãã®è³æãã芧ãã ããã
ããã§ãFlutterã®5ã€ã®æ©èœãæ€èšããããšãææ¡ããŸããããã¯ãç§ã«ãšã£ãŠæãèå³æ·±ãã泚ç®ã«å€ãããã®ã§ããã
1.ããããªããŒã
ç°¡åãªã¢ããªã±ãŒã·ã§ã³ããå§ããŸãããã 3ã€ã®ãã¿ã³ããããŸãã ãããã®ããããã¯ãããã¹ãã®è²ãå€æŽããããã«èšèšãããŠããŸãã ãã¹ãŠæ¬¡ã®ããã«ãªããŸãã
![](https://habrastorage.org/getpro/habr/post_images/3a2/a26/957/3a2a26957306962439a2710d1c5883de.gif)
ããã¹ãã®è²ãå€æŽãã3ã€ã®ãã¿ã³ãæã€ã¢ããªã±ãŒã·ã§ã³
ããã§ãFlutterã®æãèå³æ·±ãæ©èœã®1ã€ã§ããããããªããŒããå©çšããŸãã ãã®ã¡ã«ããºã ã«ããããããžã§ã¯ããéåžžã®WebããŒãžã®ããã«å³åº§ã«åæ§ç¯ã§ããŸãã å®éã«èŠãŠã¿ãŸãããïŒ
![](https://habrastorage.org/getpro/habr/post_images/8d3/3d1/932/8d33d1932d90796523b38da811388c6f.gif)
ããããªããŒã
ããã§äœãããŠããã®ïŒ ã³ãŒãå ã®äœãïŒç¹ã«ããã¿ã³äžã®ããã¹ãïŒãå€æŽããïŒIntelliJ IDEã®äžéšã«ããïŒ[
Hot Reload
]ãã¿ã³ãã¯ãªãã¯ããŠãã³ãŒãã®å€æŽãããŒãžã«ã©ã®ããã«åœ±é¿ããããããã«ç¢ºèªããŸãã
ããããªã»ããã¯ãé床ã ããç®ç«ã€ãã®ã§ã¯ãããŸããã 圌ã¯ãŸãéåžžã«ç¥çã§ãã ããŒãžã«ãã§ã«è¡šç€ºãããŠããããŒã¿ãããå ŽåããŸãã¯ãã®èŠçŽ ã®å€èŠ³ã«åœ±é¿ããå ŽåïŒãã®äŸã§ã¯ããã¹ãã®è²ã§ãïŒãããã°ã©ã ã®å®è¡äžã«ã€ã³ã¿ãŒãã§ã€ã¹ãèšè¿°ããã³ãŒããå€æŽã§ããŸãããã®åŸãããããªã¹ã¿ãŒããå®è¡ãããšã以åã«åºåãããããŒã¿ã¯ãåèµ·ååŸã«ãçãæ®ããŸããã
2.ãããªã¢ã«ãã¶ã€ã³ããã³ã¯ãããŒãã¹ã¿ã€ã«ã®ãŠã£ãžã§ããã®ã»ãã
Flutterã®ãã1ã€ã®åªããæ©èœã¯ããã®ã©ã€ãã©ãªã«éåžžã«å°è±¡çãªçµã¿èŸŒã¿ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ãã»ãããããããšã§ãã å®éãããã«ã¯2ã»ããã®ãŠã£ãžã§ããããããŸã- ãããªã¢ã«ãã¶ã€ã³ã¹ã¿ã€ã«ïŒAndroidã®å ŽåïŒãšã¯ãããŒãã¹ã¿ã€ã«ïŒiOSã®å ŽåïŒã®ãŠã£ãžã§ããã§ãã ããããããå¿ èŠãªãã®ãéžæã§ããŸãã ããšãã°ãæ°ãã
FloatingActionButton
ãŠã£ãžã§ãããããŒãžã«è¿œå ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
![](https://habrastorage.org/getpro/habr/post_images/60f/8cb/6b9/60f8cb6b9367f23f7b4c1db2df0c74d5.gif)
FloatingActionButtonãŠã£ãžã§ãããã¢ããªã±ãŒã·ã§ã³ããŒãžã«è¿œå ããŸã
æè¯ã®éšåã¯ãã¯ãã¹ãã©ãããã©ãŒã æ§ã§ãã ããšãã°ãMaterial DesignãŸãã¯Cupertinoã®ã¹ã¿ã€ã«ã®ãŠã£ãžã§ããããããžã§ã¯ãã«è¿œå ãããå Žåãã©ã®AndroidãŸãã¯iOSããã€ã¹ã§ãåãããã«è¡šç€ºãããŸãã ãã®çµæãéçºè ã¯ãããŸããŸãªããã€ã¹ã§äœæããã€ã³ã¿ãŒãã§ã€ã¹ã®å€èŠ³ã«ã€ããŠå¿é ããããšã¯ã§ããŸããã
3.ãŠã£ãžã§ãã-ãã¹ãŠã®åºç€
åã®å³ã§ãããããã«ãFlutterã䜿çšãããšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãç°¡åã«äœæã§ããŸãã ããã¯ããã¹ãŠããŠã£ãžã§ããã§è¡šãããFlutterã®åºæ¬åçã®ãããã§å¯èœã§ãã ã¢ããªã±ãŒã·ã§ã³ã¯ã©ã¹ã¯MaterialAppãŠã£ãžã§ãããã¬ã€ã¢ãŠãæ§é ã¯ScaffoldãŠã£ãžã§ããã AppBar ã Drawer ã SnackBarãªã©ã®ä»ã®ãã¹ãŠã®ããŒãžèŠçŽ ããŠã£ãžã§ããã§è¡šãããŸãã åãæ¹æ³ããèŠçŽ ã®æŽåãªã©ã®ã¢ã¯ã·ã§ã³ã«é©çšãããŸãã ããšãã°ãç¢æãäžå€®ã«æããã«ã¯ã
Cmd/Ctrl + Enter
ããŒã®çµã¿åããã䜿çšããŠã
Center
ãŠã£ãžã§ããã«å¯Ÿå¿ããèŠçŽ ãé 眮ããã ãã§ãã
![](https://habrastorage.org/getpro/habr/post_images/72b/5ef/5b3/72b5ef5b305ca2283cea8af80b2b1bf7.gif)
èŠçŽ ã®é 眮
ãã®ã¢ãããŒãã®ãããã§ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæã¯ãããŸããŸãªå°ããªèŠçŽ ããã¬ã€ã¢ãŠããçµã¿ç«ãŠããšããåçŽãªã¿ã¹ã¯ã«åæžãããŸãã
ããã§èª¬æããååã¯ãFlutterã®åºã«ãªã£ãŠããå¥ã®åºæ¬çãªèãæ¹ãšçµã¿åããããŠããŸãã ã€ãŸããããã§ã¯ãç¶æ¿ãããåæãåªå ããããšããäºå®ã«ã€ããŠè©±ããŠããŸãã ã€ãŸããæ°ãããŠã£ãžã§ãããäœæããå¿ èŠãããå Žåã¯ã
Widget
ã¯ã©ã¹ãå±éãã代ããã«ïŒAndroidã§ã¯
View
ã¯ã©ã¹ãå±éããããšã«ããïŒãæ°ãããŠã£ãžã§ããã¯ããã€ãã®æ¢åã®ãŠã£ãžã§ããããçµã¿ç«ãŠãããŸãã
4. Androidããã³iOSã®ããŒã
éåžžãAndroidã¢ããªã¯iOSã¢ããªãšã¯ç°ãªãå€èŠ³ã«ããå¿ èŠããããŸãã éãã¯ãã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã®è²ã ãã§ãªãããŠã£ãžã§ããã®ãµã€ãºãšã¹ã¿ã€ã«ã«ããããŸãã 次ã®ãããã¯ã䜿çšããŠãç°ãªããã©ãããã©ãŒã äžã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ãæ£ãã衚瀺ã§ããŸãã
![](https://habrastorage.org/getpro/habr/post_images/46e/666/c84/46e666c84770466622167f308533f51f.png)
ãã©ãã¿ãŒããŒãã®å€èŠ³ãžã®åœ±é¿
ããã§ã¯ã
Toolbar
èŠçŽ ïŒ
AppBar
ïŒã«ç°ãªãè²ãšåºåãªãã·ã§ã³ãèšå®ãããŠããããšãããããŸãã ããã¯
Theme.of(context).platform
ã䜿çšããŠè¡ãããçŸåšã®ãã©ãããã©ãŒã ïŒAndroidãŸãã¯iOSïŒã«é¢ããæ å ±ãååŸã§ããŸãã
import 'package:flutter/material.dart'; class HelloFlutter extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: "HelloFlutter", theme: new ThemeData( primaryColor: Theme.of(context).platform == TargetPlatform.iOS ? Colors.grey[100] : Colors.blue), home: new Scaffold( appBar: new AppBar( elevation: Theme.of(context).platform == TargetPlatform.iOS ? 0.0 : 4.0, title: new Text( "HelloFlutter", ), ), body: new Center(child: new Text("Hello Flutter!")), )); } }
5.æ©èœãæ¡åŒµããæ©èœ
Flutterã¯ãŸã ã¢ã«ãã¡çã§ããããã®ã©ã€ãã©ãªã«ã¯æ¢ã«éåžžã«å€§ãã掻çºãªã³ãã¥ããã£ãéãŸã£ãŠããŸãã ããã«ãããFlutterã¯å€ãã®ããã±ãŒãžïŒAndroidã®GradleäŸåé¢ä¿ãªã©ã®ã©ã€ãã©ãªïŒããµããŒãããŸãã å©çšå¯èœãªããã±ãŒãžã«ã¯ãç»åã®æäœãHTTPãªã¯ãšã¹ãã®å®è¡ãããŒã¿ã®å ±æãèšå®ã®ä¿åãã»ã³ãµãŒã®æäœãFirebaseã®æ©èœã®äœ¿çšãæ¯æŽããããã±ãŒãžããããŸãã ãããŠãã¡ãããããã¯ãã¹ãŠãAndroidã®éçºãšiOSã®éçºã®äž¡æ¹ã«é©çšã§ããŸãã
ãŸãšã
Flutterã«ã€ããŠåŠç¿ããåŸã«ãã®ã©ã€ãã©ãªãåŠç¿ãããå Žåã¯ãããããGoogle CodelabsãªãœãŒã¹ã«æçš¿ããã段éçãªã¬ãã¹ã³ããå§ããã®ãæåã§ãã ç¹ã«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæããã»ã¹ã瀺ãåºæ¬çãªäœæ¥æ¹æ³ã«é¢ããã¬ã€ãããããŸãã ããã§ã¯ãFlutterã§äœæãããã¢ããªã±ãŒã·ã§ã³ã§Firebaseæ©èœã䜿çšããããã®ã¬ã€ãã³ã¹ãèŠã€ããããšãã§ããŸãã
ãããŠã ããã§ã¯ãFlutterã䜿çšããŠäœæãããã€ã³ã¿ãŒãã§ã€ã¹ãèŠãŠãããããè©Šãããšãã§ããŸãã
芪æãªãèªè ïŒ ã¯ãã¹ãã©ãããã©ãŒã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã«äœ¿çšããããŒã«ã¯äœã§ããïŒ