2018幎8æãFlutterã¯Stack Overflowã§æãèŠæ±ã®é«ãã¯ãã¹ãã©ãããã©ãŒã ãã¯ãããžãŒã«ãªããŸããã
Googleã®èªå®ä»£çåºã§ããSurfã® Artem ZaitsevãšEvgeny Saturovã¯ãããã°ã§ãã®çç±ãšãã®æ¹æ³ã説æããŸãã
ã¯ãã¹ãã©ãããã©ãŒã ãœãªã¥ãŒã·ã§ã³ã¯ãMVP補åãè€æ°ã®ãã©ãããã©ãŒã ã§åæã«äœã³ã¹ãã§åæã«èµ·åããã人ãé·ãéæ¹ãã€ããŠããŸããã çç±ã¯ç°¡åã§ã-åäžã®ã³ãŒãããŒã¹ã ä¿å®ãç°¡åã§ããã¢ãŒãã£ãã¡ã¯ãã¯éäžåãããããžãã¯ã®éè€ãåãã©ãããã©ãŒã ã®åããã°ã®ç·šéã¯ãããŸããã ãããŠã人ã
ã¯ããããµããŒãããŠäœæããããã«å¿
èŠãªãã®ãå°ãªããªããŸã-2人ã®ãã€ãã£ãéçºè
ãç¶æããå¿
èŠã¯ãããŸããã
æ¢åã®ãã¬ãŒã ã¯ãŒã¯ã¯ãè€éã§ããããæè¡çãªå®è£
ã®ãã¥ã¢ã³ã¹ã®ããã«ããŸãçç£çã§ã¯ãªããããã°ã§ãã£ã±ãã§ãã 人ã
ã¯åœŒãã®å©ããåããŠãæå°éã®æ©èœãè¿
éã«ååŸããæçµçã«ã¯ãããžã§ã¯ããé·æçã«æžãçŽãéåœã«ãããŸãã
éããªããGoogleã®æ°ããã¢ãã€ã«éçºãã¬ãŒã ã¯ãŒã¯ã§ããFlutterã®æçµãªãªãŒã¹ã¯ãStack Overflowã§æãèŠæã®é«ãã¯ãã¹ãã©ãããã©ãŒã ãã¯ãããžãŒã«ãªããšäºæ³ãããŸãã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³å°çšã«èšèšãããŠãããAndroidãšiOSã®2ã€ã®ãã©ãããã©ãŒã ãã«ããŒããŠããããšã匷調ããŸãã çŸæç¹ã§ã¯ã Release Preview 2ããŒãžã§ã³ãæäŸãããŠããŸãã Flutterã®æ°ãããããžã§ã¯ãã¯ç¹å¥ãªã³ã¬ã¯ã·ã§ã³ã«åé¡ããããã®ç®çã¯ãã¬ãŒã ã¯ãŒã¯ã®æ©èœã瀺ãããšã§ãã çŸåšããã¬ãŒã ã¯ãŒã¯ã¯ãéçºè
ã³ãã¥ããã£ïŒããšãã°ãReduxã®å®è£
ïŒã®ãããã§ãã³ã³ããŒãã³ããšã¢ãŒããã¯ãã£ã¢ããªã³ã§ç©æ¥µçã«æŽæ°ãããŠããŸãã
Flutterãä¿¡ããå¿
èŠãããã®ã¯ãªãã§ããïŒ
è¿
éãªéçºã®ããã®åªãããã¥ãŒãã³ã°
éåžžã®Android Studioããæãåºãå¿
èŠã¯ãããŸããã ãã©ã°ã€ã³ã䜿çšãããšã Flutterã¢ããªã±ãŒã·ã§ã³ã®éçºã«å®å
šã«é©åããŸãã
ããããªããŒãã¯ããã¹ãŠã®å€æŽãã³ãŒãããå®è¡äžã®ãšãã¥ã¬ãŒã¿ãŒãŸãã¯æ¥ç¶ãããããã€ã¹ã«å³åº§ã«è»¢éã§ããããã«ãããã©ãŒæ©èœã§ãã
ã¬ã€ã¢ãŠãã®ã·ã³ãã«ããšè¡šçŸå
Androidåãã®ã¢ããªã±ãŒã·ã§ã³ãéçºããããšããããªããã¬ã€ã¢ãŠãã¯ããªãã楜ããã§ãããã®ã§ã¯ãªããšç¢ºä¿¡ããŠããŸãã
ãã©ãã¿ãŒã¯ç°ãªããŸãã ãŸããã¬ã€ã¢ãŠãä»ãã®XMLãã¡ã€ã«ã¯ãããŸããããŠã£ãžã§ããã¯ã³ãŒãå
ã§çŽæ¥äœæããã³æ§æãããŸãïŒAnko Layoutsãé£æ³ããããã®ïŒã ãã¥ãŒã®ä»£ããã«ããŠã£ãžã§ããã䜿çšãããŸãã
new Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Padding( padding: EdgeInsets.all(16.0), child: Text( '$_name', ), ), //...
ããã¯ã Flutterãããžã§ã¯ãã®ã³ãŒãã®å€èŠ³ã§ãã æåã¯ãèšå€§ãªæ°ã®ãã©ã±ãããæãã£ãŠããŸããããã®ãããªãæšãã¯ããªãèŠèŠçã§ãã Flutterã¯æ§æãä¿é²ããŸããæ¢è£œã®ãŠã£ãžã§ããããããã¶ã€ããŒãªã©ã®æ°ãããŠã£ãžã§ãããäœæã§ããŸãã ã»ãšãã©ãã¹ãŠã®ã³ã³ããŒãã³ãã«ã¯ãããããå¥ã®èŠçŽ ãŸãã¯èŠçŽ ã®é
åãåãå
¥ããåããããã£ãŸãã¯åããããã£ããããŸãã ãã¹ãŠãã·ã³ãã«ã§æ確ã§ãã çŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãååã«é«éã«ããããšãã§ããŸãã
次ã«ããã©ãããã©ãŒã ã®äœæè
ã¯ãæåããéçºè
ã«æ¢è£œã®ãŠã£ãžã§ããã®ã«ã¿ãã°ãæäŸããŸãã ãããªã¢ã«ã³ã³ããŒãã³ããšã¯ãããŒããšãã2ã€ã®èŠçŽ ã»ãããå«ãŸããŠãããåãã©ãããã©ãŒã ã«ãã€ãã£ãã«èŠããŸãã ã¯ãã¹ãã©ãããã©ãŒã ãŠã£ãžã§ãããå©çšã§ããŸãã ãããã®å€èŠ³ãšåäœã¯ãiOSããã€ã¹ãšAndroidããã€ã¹ã§åãã§ãã
ãªã¢ã¯ãã£ããã¬ãŒã ã¯ãŒã¯
å€æ°ã®æ¢è£œã®ãŠã£ãžã§ããã ãã§ãªããèšè¿°ããªããã°ãªããªãèšèªããããããçŸããå¿«é©ãªUIãçæéã§äœæã§ããŸãã Dartã¯ãJavaãJavaScriptãCïŒã«äŒŒãŠããŸãã ããã¯è¡šçŸåè±ãã§ããã¬ãŒã ã¯ãŒã¯ã®ããŒãºã«å®å
šã«åãããããŠããŸãããKotlinã®åŸãæ§æã®ããã€ãã®èžè¡çãªéå°ã¯è»œãæ··ä¹±ã«é¥ãããšããããŸãã
Flutter㯠ãåãã©ãããã©ãŒã ã®ãã€ãã£ãã³ãŒãã«ã³ã³ãã€ã«ãããŸãã ãããŒãã®äžãã圌ã¯ã°ã©ãã£ãã¯ãšã³ãžã³ãšããŠSkiaã䜿çšããŸãã
ã·ã¹ãã ã¢ãŒããã¯ãã£ã®éèŠãªæ©èœã¯ããã¹ãŠã®ãŠã£ãžã§ãããšããã£ã³ãã¹äžã§ãŠã£ãžã§ãããã¬ã³ããªã³ã°ããã³ã³ããŒãã³ããããã©ãããã©ãŒã ã§ã¯ãªãã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ããããšã§ãã ã³ã³ããã¹ãã®åãæ¿ããšãããªããžãã®äœ¿çšãäžèŠã§ãããããããã©ãŒãã³ã¹ãåäžããUIãã¬ã³ããªã³ã°ãããšãã«60 FPSã®å€§åãªæ°åãéæããã®ã«åœ¹ç«ã¡ãŸãã
ãã©ãããã©ãŒã ã®ãã«ãã¯ãŒã¯ãŸã ããªãã®æã«ãããŸã
10幎åããã¢ãã€ã«ã³ãã¥ããã£ã«ãã£ã倧éã®äŸ¿å©ãªã³ãŒããæŸæ£ããã®ã¯ãªãã§ããïŒ ãã€ãã£ãSDKã¢ããªã±ãŒã·ã§ã³ããã³ãã©ãããã©ãŒã APIã§å©çšå¯èœãªãã¹ãŠã®ã©ã€ãã©ãªã¯ã Flutterã¢ããªã±ãŒã·ã§ã³ã«äœ¿çšã§ããŸãã
ç°å¢èšå®
Flutterã®äœ¿çšã¯ç°¡åã§ãã
éçºæã«ã¯ãå
¬åŒããã¥ã¡ã³ãã§ã¯ãAndroid StudioãIntelliJããŸãã¯VSCodeãé©åãªãã©ã°ã€ã³ãšãšãã«äœ¿çšããããšãæšå¥šããŠããŸãããä»»æã®ããã¹ããšãã£ã¿ãŒãé©ããŠããŸãã
æåã®ã¹ããã
OSã®å
¬åŒãµã€ãããFlutter SDKããã¢ãŒã«ã€ããããŠã³ããŒãããŸãã ç®çã®ãã£ã¬ã¯ããªã«è§£åãã flutter doctor
ã³ãã³ããå®è¡ããŸãã ãã®ã³ãã³ãã¯ãå¿
èŠãªãã®ããã¹ãŠã€ã³ã¹ããŒã«ãããŠãããã©ãããããã³ã€ã³ã¹ããŒã«ãããŠããIDEã®ãã©ã°ã€ã³ãååšãããã©ããã確èªããŸãïŒããšãã°ãAndroid Studioãã€ã³ã¹ããŒã«ãããŠããå ŽåããŠãŒãã£ãªãã£ã¯ãã©ã°ã€ã³ã確èªããŸãïŒã
第äºæ®µé
ãã¹ãŠãé 調ã«é²ãã å Žåãæåã®ãããžã§ã¯ãã®äœæãéå§ã§ããŸãã ãšã©ãŒãèŠã€ãã£ãå Žåãå»åž«ã¯ãããã解決ããæ¹æ³ãæããŠãããŸãã
第äžæ®µé
Android Studioã§Flutterã䜿çšããã«ã¯ã2ã€ã®ãã©ã°ã€ã³FlutterãšDartãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã èšå®ãéããæ€çŽ¢ã§å¿
èŠãªãã©ã°ã€ã³ãéžæããããšã«ãããæšæºçãªæ¹æ³ã§ã€ã³ã¹ããŒã«ã§ããŸãã
ç°å¢ã®ã»ããã¢ããã®è©³çŽ°ã¯ã å
¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããŸã ã
ããŒã
import 'package:flutter/material.dart'; void main() => runApp(MyApp());
Flutterã¢ããªã±ãŒã·ã§ã³ãèŠããšãã«æåã«ç®ãåŒãã®ã¯ãçããã³ãŒãã§ãã Androidéçºã®äžçã§ã¯Javaã䜿çšãããæè¿ã§ã¯Kotlinã䜿çšãããŠããŸãã
ä»ã圌ããšäžŠãã§ããã®ãDartã§ãã Googleã¯ã匷åãªã¿ã€ãã³ã°ãé«ãããã©ãŒãã³ã¹ãæè»æ§ãåããJavaScriptã®ä»£æ¿ãšããŠäœçœ®ä»ããŠããŸãã
Dartæ§æã¯ç°¡åã«ç¿åŸã§ããŸãããKotlinã»ã©ãããã§ã¯ãããŸããã ããããããã¯å¥œã¿ãšç¿æ
£ã®åé¡ã§ãã
ãããžã§ã¯ãäœæ
ãããžã§ã¯ããäœæããã«ã¯ãã³ã³ãœãŒã«ã§flutter create nameã³ãã³ããå®è¡ããããIDEã䜿çšããŸãïŒAndroid StudioâNew Flutter ProjectïŒã
ã¢ããªã±ãŒã·ã§ã³æ§é
ãããžã§ã¯ããäœæãããšã次ã®æ§é ã衚瀺ãããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒããã£ã¬ã¯ããªã«ã¯ãlibãiosãandroidãtestã®4ã€ã®ããã±ãŒãžããããŸãã
æåã¯ãã¬ãŒã ã¯ãŒã¯ãã£ã¬ã¯ããªã§ãã ãã¹ãŠã®dartãã¡ã€ã«ãšã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã¯ããã«ãããŸãã Flutterã¯ãã€ãã£ãã³ãŒãã«ã³ã³ãã€ã«ãããŠãããšããäºå®ã«ããããããããã©ãããã©ãŒã ããšã«ããã€ãã®ãã€ãã£ãã€ã³ã¿ã©ã¯ã·ã§ã³ãèšè¿°ããå¿
èŠããããŸãã ããã«ã Flutterã¯æ¢åã®ã¢ããªã±ãŒã·ã§ã³ã«çµ±åã§ããŸãã ãã€ãã£ãã³ãŒãã«ã¯ãç¹å®ã®ãã©ãããã©ãŒã ã«éŠŽæã¿ã®ããèšèªïŒObj-C / SwiftãŸãã¯Java / KotlinïŒã§èšè¿°ã§ããios / androidãšãã2ã€ã®ããã±ãŒãžãæäŸãããŸãã ãã¹ãããã±ãŒãžå
ã«ãã¹ãããããŸãã
ã«ãŒããã£ã¬ã¯ããªã«pubspec.yamlæ§æãã¡ã€ã«ããããŸã-ã©ã€ãã©ãªãããã«æ¥ç¶ãããŠãããªã©ã é¡æšã«ã€ããŠèšãã°ã Flutterã«ãšã£ãŠã¯build.gradleã®ãããªãã®ã§ãïŒãããååšããŸãããæ¢ã«ãã€ãã£ãã®AndroidããŒãã«å«ãŸããŠããŸãïŒã
libããã±ãŒãžã¯è¿œå ã®ããã±ãŒãžã«åå²ããããšãã§ããŸã-ãã§ã«1ã€ãŸãã¯å¥ã®ã¢ãŒããã¯ãã£ã䜿çšãããšãã奜ã¿ãšèŠæã®åé¡ããããŸãã ã¡ãªã¿ã«ã Flutterã§ã¢ããªã±ãŒã·ã§ã³ãäœæããã«ã¯ããŸããŸãªããªãã¯ã䜿çšãããŸã ã
ãããžã§ã¯ãã«ã¯ããµã³ãã«ã®ã³ãŒããå«ãmain.dartãã¡ã€ã«ãããã«ãããŸãã ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãã¡ã€ã³ã¡ãœããã§ããåäžã®ãšã³ããªãã€ã³ãããããŸãã 圌ã¯ãã«ãŒããŠã£ãžã§ããã®äœæãæ
åœããŠããŸãã
ãã¹ãŠããŠã£ãžã§ããã§ã
ç»é¢ã«è¡šç€ºãããïŒãŸãã¯è¡šç€ºãããªãïŒãã¹ãŠãã€ã³ã¿ã©ã¯ã·ã§ã³ãšã¢ããªã±ãŒã·ã§ã³èªäœã¯ãŠã£ãžã§ããã§ãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãšã³ãã£ãã£ã¯ãŠã£ãžã§ããã§ãã ããã¹ãããã¯ã¹ãã€ã³ãã³ããŸãã¯ãžã§ã¹ãã£æ€åºåš-ãŠã£ãžã§ããã ã¢ããªã±ãŒã·ã§ã³ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠãããããæ§ç¯ãããŸãã
å
¬åŒWebãµã€ãã«ãããšããåãŠã£ãžã§ããã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äžéšã®äžå€ã®èª¬æã§ããã
ããšãã°ã次ã®ç»é¢ã§ã¢ããªã±ãŒã·ã§ã³ããã«ãããŸãããã
ããã«ã¯æ¬¡ã®ãŠã£ãžã§ããããããŸãã
- ã¢ããª
- ã¹ã¯ãªãŒã³
- Appbar
- ããã¹ã
- ããŒããŒä»ããã¿ã³
ãããã®äžéšã¯ãã¬ãŒã ã¯ãŒã¯ã«å®è£
ãããäžéšã¯å®æããããŒãèªäœã§æ§æããå¿
èŠããããŸãã
ãŠã£ãžã§ããã«ã¯ã Stateless
ãšStateful
2ã€ã®ã¿ã€ãããããŸãã åè
ã¯éçïŒããã¹ããªã©ïŒã§ãããåŸè
ã¯ç¶æ
ã®å€æŽïŒç»é¢ãªã©ïŒããµããŒãããŸãã
ã¹ããŒãã¬ã¹
ã¢ããªã±ãŒã·ã§ã³å
ã®ãã®ãããªãŠã£ãžã§ããã®äŸã¯ãMyAppã§ãã ãããã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãã§ãã å
éšã«ã¯ããã«ãã¡ãœããã䜿çšããã¬ã³ããªã³ã°ã«å¿
èŠãªãã¹ãŠã®ãã®ãé
眮ããŸãã
class MyApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: new AppBar( title: new Text("Flutter Random Name"), ), body: new MyHomePage(), ), ); } }
éçãŠã£ãžã§ããã¯ã StatelessWidget
ã¯ã©ã¹ã®ç¶æ¿ã§ãã ãã«ãã¡ãœããããªãŒããŒã©ã€ããããã®äžã«å¿
èŠãªèŠçŽ ãåéããã ãã§ãã ãã©ãã¿ãŒã¯åæãä¿é²ããŸãã æ°ããã¢ã€ãã ãäœæããã«ã¯ãæ¢åã®ã¢ã€ãã ãå±éããªãã§ãã ããã
äŸã§ã¯ããã®ãŠã£ãžã§ããã¯MaterialApp
ïŒMaterialDesignã®ã³ã³ããŒãã³ãã«åºã¥ãã¢ããªã±ãŒã·ã§ã³ã®ã«ãŒãïŒããæ§ç¯ããããã®å
éšã«Scaffold
ããããŸã-ãããç»é¢ã§ãã
MyHomePage
ã¯ã AppBar
ãé€ãç»é¢ã®æ¬äœãæç»ãããŠã£ãžã§ããã§ããããŸãã ãã®å Žåãç¶æ
ããããŸãã 以äžã§åœŒã«ã€ããŠè©±ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã®æ§ç¯ã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒæ°ã®åæåã§å¯Ÿå¿ãããã£ãŒã«ãã«æž¡ãããšã«ãã£ãŠè¡ãããŸãã Dartã¯ããªãã·ã§ã³ã®ã¡ãœãããã©ã¡ãŒã¿ãŒããµããŒãããŸããããã«ãããUIãæè»ã«äœæã§ããŸãã
泚ïŒ2çªç®ã®ããŒãžã§ã³ããå§ãŸãDartã®new
åèªã¯ãªãã·ã§ã³ã§ãã
ãã®ãããªãŠã£ãžã§ããã®ã¬ã€ã¢ãŠãã䜿çšãããšãéçãªã¢ããªã±ãŒã·ã§ã³ç»é¢ãååŸã§ããŸãã ããã«ãéçºè
ã®æ³ååã¯ãŸã£ããç¡éã§ãã
ã¹ããŒããã«
ç¶æ
ãŠã£ãžã§ããã¯ãç¶æ
ãå€åãããšãã«åæç»ããµããŒãããŸãã ãã®ãããªãŠã£ãžã§ãããäœæããã«ã¯ã StatefullWidget
ããç¶æ¿ããç¶æ¿ã¯ã©ã¹State<T>
ãäœæããå¿
èŠããããŸããããã¯ããŠã£ãžã§ããã®ç¶æ
ã§ããããŠãŒã¶ãŒãã¹ããŒããã©ã³ã®ç»é¢ã«è¡šç€ºãããã®ãæ
åœããŸãã
ãŠã£ãžã§ããã®ç¶æ
ã¯ã setState() {}
ã¡ãœãããåŒã³åºãããšã§setState() {}
ããŸãã å
éšã§ã¯ãããšãã°ããã¿ã³ã«ç°ãªãèæ¯è²ãèšå®ã§ããŸãããã¬ãŒã ã¯ãŒã¯èªäœããUIã®æå°éå¿
èŠãªåæç»ã決å®ããŸãã
ç§ã®å Žåã MyHomePage
ã¡ã€ã³ããŒãžã¯ç¶æ
ãŠã£ãžã§ããã«ãªããŸãã _isLoading
ããã¹ããããã¯ã«è¡šç€ºãããååãããã³ããŠã³ããŒããã©ã°_isLoading
ïŒå
éšLoadingButton
ãŠã£ãžã§ããã®LoadingButton
æ¹æ³ãæ
åœããŸãã芪ãä»ããç¶æ
å¶åŸ¡ã®äŸïŒãLoadingButton
ãŸãã
class _MyHomePageState extends State<MyHomePage> { String _name = ""; bool _isLoading = false; @override Widget build(BuildContext context) => Center( child: new Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Padding( padding: EdgeInsets.all(16.0), child: Text( '$_name', ), ), LoadingButton( isLoading: _isLoading, action: _generateName, ) ], ), ); }
ãã¿ã³ã«ã¯ã _generateName()
ã¡ãœããããã£ãŒããããã³ãŒã«ããã¯action
ããããŸãã Dartã«ã¯private
ãpublic
ãªã©ã®ã¢ã¯ã»ã¹ä¿®é£Ÿåã¯ãããŸããã ããããã¢ãžã¥ãŒã«å
ã§ãã©ã€ããŒããªãã®ãäœãããå Žåãååã¯æ¥é èŸã_ãã§å§ãŸãå¿
èŠããããŸãã
_generateName
ã¡ãœãã_generateName
éåæã§ãã 圌ã¯ãååãããŒããã isLoading
ãã©ã°ãå€æŽããå€ãname
èšå®ãã責任ããããŸããããã«ããããã¿ã³ãšããã¹ããåæç»ãããŸãã
final snack = SnackBar(content: Text("Handle error!")); _generateName() async { toggleLoading(); try { // await // Json setName(map["name"]); toggleLoading(); } catch (e) { setName("oops!"); Scaffold.of(context).showSnackBar(snack); toggleLoading(); } } void toggleLoading() { setState(() { _isLoading = !_isLoading; }); }
ç¶æ
ãå€æŽããã«ã¯ã setState() {}
åŒã³åºãå¿
èŠããããŸãã ãã®åŒã³åºãããªããã°ããŠã£ãžã§ããã¯åæç»ãããŸããã
ããŒããŒã®å®è£
ã¯éåžžã«ç°¡åã§ããããšãå€æããŸããã åæç»æã«ã¯ãããã¹ããŸãã¯ã€ã³ãžã±ãŒã¿ã®ããããããã¿ã³ã«çœ®ââãæããããŸãã
å®è£
ã«ã¯æ°è¡ããããããŸãã
_buildButtonChild() { if (isLoading) { return Transform.scale( scale: 0.5, child: CircularProgressIndicator(), ); } else { return Text("Click for name"); } }
ãµã€ãºãå°ããããã«ã¯ã Transform.scale
å¿
èŠã§ãã
FlutterãšDartã®éåæçžäºäœçšã¯ã async-await
åºã¥ããŠasync-await
ãŸãã 詳现ã¯ãã¡ã ã ãã¡ã ã ãã¡ããã芧ãã ãã ã
ã©ãããå§ããŸããïŒ
ä»æ¥ãæ°ããFlutterã³ã³ãã³ããã»ãŒæ¯æ¥ãªãªãŒã¹ããããšããã®ãã¯ãããžãŒã§åéãäœãã®ã«åœ¹ç«ã€è¯ãã³ãŒã¹ãäžè¶³ããããšã¯ãããŸããã
åºæ¬çãªFlutterã³ãŒã¹ã®å¥œäŸã¯ã Udacityã®ã³ãŒã¹ã§ãã ã¬ãã¹ã³ã¯2ã€ã®ç« ã«åãããŠãããããããã®ææ
®æ·±ãçµéã«ã¯3ã4æéããããŸãã
ã³ãŒã¹ãéžæã§ããªãå Žåã¯ãæ¢åã®ãããžã§ã¯ãã®ãœãŒã¹ã調ã¹ãŠããã¯ãããžãŒã«é£ã³èŸŒã¿ãŸãããã awesome-flutterãªããžããªã«ã¯ããã®ãããªãããžã§ã¯ããå€æ°å«ãŸããŠããŸãããŸããæ¢æã®ã©ã€ãã©ãªããœãªã¥ãŒã·ã§ã³ããµã³ãã«ãããã³ç 究ãã€ã³ã¹ãã¬ãŒã·ã§ã³ã®ããã®ãã®ä»ã®è³æãéåžžã«è±å¯ã«æã£ãŠããŸãã
ãããã«
以åã®æçè«ããã®ãããã¯ãžã®ããæ·±ã没å
¥ã®çµæã«ãããšãç§ãã¡ã«ã¯çè·¡ããããŸããã§ããã Flutterã¯å®éšã®ãããªãã®ã§ã¯ãªããä»åŸæ°å¹Žéã§ã¢ãã€ã«éçºæ¥çã®éèŠãªéšåãé²ãæ¹åã瀺ããŠããŸãã Flutterã®åºç€ãšãªãããã€ãã®å€§èãªã³ã³ã»ããã¯ãéçºã«æ°ããã¢ã€ãã¢ãšæ©äŒããããããŸãã é«éã§ã»ãŒçŽæçãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®äœæã«ããããããã¿ã€ãã³ã°ãšUXå®éšããããŸã§ä»¥äžã«ç°¡åã«ãªãã誰ããã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã Flutterããã®ã¢ããªã±ãŒã·ã§ã³ãèŠã€ããã®ã¯ã©ã®é åã§ããã-æéã§ããããŸãã