æè¿ã§ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããããã®Googleã®æ°ãããã¬ãŒã ã¯ãŒã¯ã§ããFlutterãçºèŠãããããŸã§ããã°ã©ãã³ã°ããããšããªã人ã«Flutterã®åºæ¬ãç€ºãæ©äŒãããããŸããã Flutterèªäœã¯ãã³ã³ãœãŒã«ã®äžçã«éã蟌ãã Chromeãã©ãŠã¶ãŒã§çãŸããDartã§æžãããŠããã®ã§ããããŒããFlutterã¯Goã§æžãããããããªãïŒã
ã©ãããŠïŒ GoãšDartã¯ã©ã¡ããGoogleãäœæãããã®ã§ãã©ã¡ããã³ã³ãã€ã«ãããèšèªãå
¥åããŸããããã€ãã®ã€ãã³ããå°ãå€ããŠãã ãããGoã¯Flutterã®ãããªå€§èŠæš¡ãããžã§ã¯ããå®è£
ããåªããåè£ã§ãã 誰ããèšãã ãã-Goã«ã¯ã¯ã©ã¹ããžã§ããªãã¯ãäŸå€ã¯ãªãã®ã§ãé©åããªãã
ã ãããFlutterã¯æ¢ã«Goã§æžãããŠãããµããããŸãããã ã³ãŒãã¯ã©ã®ããã«èŠããäžè¬çã«ã¯æ©èœããŸããïŒ

Dartã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
ç§ã¯ããã©ãŠã¶ãŒã§JavaScriptã®ä»£æ¿ãšããŠéå§ãããŠä»¥æ¥ããã®èšèªã䜿çšããŠããŸãã Dartã¯ãã°ããã®éChromeãã©ãŠã¶ã«çµã¿èŸŒãŸããJSã«åã£ãŠä»£ããããšãæåŸ
ãããŠããŸããã 2015幎3æã«ChromeããDartãµããŒããåé€ãããããšãèªãã®ã¯éåžžã«æ²ããããšã§ããã
ããŒãèªäœã¯çŽ æŽãããã§ãïŒ åºæ¬çã«ãJavaScriptã®åŸã¯ã©ã®èšèªãçŽ æŽãããã§ãããããšãã°Goã®åŸã§ã¯ãDartã¯ããã»ã©çŸãããããŸããã ã§ã倧äžå€«ã ã¯ã©ã¹ããžã§ããªãã¯ãäŸå€ããã¥ãŒãã£ãŒãéåæåŸ
æ©ãã€ãã³ãã«ãŒããJIT / AOTãã¬ããŒãžã³ã¬ã¯ã¿ãŒã颿°ãªãŒããŒããŒããªã©ãèãããããã¹ãŠã®æ©èœãšèããããªããã¹ãŠã®æ©èœãåããŠããŸã確çã Dartã«ã¯ãã»ãŒãã¹ãŠã®ãããçšã®ç¹å¥ãªæ§æããããŸã-ã²ãã¿ãŒ/ã»ãã¿ãŒçšã®ç¹å¥ãªæ§æãççž®ã³ã³ã¹ãã©ã¯ã¿ãŒçšã®ç¹å¥ãªæ§æãç¹å¥ãªæ§æçšã®ç¹å¥ãªæ§æãªã©ã
ããã«ãããDartã¯ãäžç®èŠãã ãã§ã以åã«ããã°ã©ãã³ã°èšèªã§ããã°ã©ãã³ã°ããçµéšã®ãã人ã«éŠŽæã¿ããããªããŸãããããã¯çŽ æŽãããããšã§ãã ãããããã®è±å¯ãªç¹æ®æ©èœãåçŽãªãHelloãworldãã®äŸã§èª¬æããããšãããšãéã«éçºãè€éã«ãªãããšãããããŸããã
- ãã³ã³ã¹ãã©ã¯ã¿ããšåŒã°ããç¹å¥ãªã¡ãœããããèªååæåã®ããã®ç¹å¥ãªæ§æãããååä»ããã©ã¡ãŒã¿ãŒã®ããã®ç¹å¥ãªæ§æããªã©ãèšèªã®ãã¹ãŠã®ãç¹å¥ãªãæ©èœã¯æ··ä¹±ããŠããŸããã
- ãé ãããããã¹ãŠãæ··ä¹±ããŸãã -ããã®é¢æ°ã¯ã©ã®ã€ã³ããŒãããã§ããïŒããã¯é ãããŠããŸããèŠã€ããããªãã³ãŒããèŠãŠããããªããã®ã¯ã©ã¹ã«ã³ã³ã¹ãã©ã¯ã¿ãŒããããŸããããã®ã¯ã©ã¹ã«ã¯ãªãã®ã§ããïŒããã«ãããŸãããé ãããŠããŸãããªã©
- ããããŸããªããã®ãã¹ãŠãæ··åãããŸã -ãååãä»ããŠããŸãã¯ä»ããã«é¢æ°ãã©ã¡ãŒã¿ãŒãäœæããŸããïŒãããconstãŸãã¯finalã«ããå¿
èŠããããŸããïŒãããããã§éåžžã®é¢æ°æ§æã䜿çšããããç¢å°ã§ççž®ããŸãããªã©ïŒ
ååãšããŠããã®ãç¹å¥ãªãããé ããããããææ§ãªãäžäœäžäœã¯ãããã°ã©ãã³ã°èšèªã§äººã
ããããžãã¯ããšåŒã¶ãã®ã®æ¬è³ªãæããŠããŸãã ãããã¯ãã³ãŒãã®èšè¿°ãç°¡çŽ åããããã«äœæãããæ©èœã§ãããå®éã«ã¯ãèªã¿åããšçè§£ãè€éã«ãªããŸãã
ãããŠããŸãã«Goãä»ã®èšèªãšã¯æ ¹æ¬çã«ç°ãªãç«å Žãåããé²åŸ¡ãæ¿ããæ¡ã£ãŠããé åã§ãã Goã¯ã»ãšãã©éæ³ã®ãªãèšèªã§ãããé ããããããç¹å¥ãªãããææ§ãªãèšèªã®éã¯æå°éã«æããããŸãã ããããGoã«ã¯æ¬ ç¹ããããŸãã
Goã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
Flutterã«ã€ããŠè©±ããŠããã®ã§ãããã¯UIãã¬ãŒã ã¯ãŒã¯ã§ãããããUIãèšè¿°ããŠæäœããããã®ããŒã«ãšããŠGoãèããŠã¿ãŸãããã äžè¬ã«ãUIãã¬ãŒã ã¯ãŒã¯ã¯å€§ããªèª²é¡ã§ãããã»ãšãã©ã®å Žåãç¹å¥ãªãœãªã¥ãŒã·ã§ã³ãå¿
èŠã§ãã UIã§æãäžè¬çãªã¢ãããŒãã®1ã€ã¯ã DSL ïŒãã¡ã€ã³åºæèšèªïŒãäœæããããšã§ããDSLã¯ãUIã®ããŒãºã«åãããŠç¹å¥ã«èª¿æŽãããã©ã€ãã©ãªãŸãã¯ãã¬ãŒã ã¯ãŒã¯ã®åœ¢åŒã§å®è£
ãããŸãã ãããŠãã»ãšãã©ã®å ŽåãGoã¯å®¢èгçã«DSLã«ãšã£ãŠæªãèšèªã§ãããšããæèŠãèãããšãã§ããŸãã
åºæ¬çã«ãDSLãšã¯ãéçºè
ãæäœã§ããæ°ããèšèªïŒçšèªãšåè©ïŒãäœæããããšãæå³ããŸãã äžã®ã³ãŒãã¯ãã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ãŒã¹ãšãã®ã³ã³ããŒãã³ãã®äž»èŠãªæ©èœãæç¢ºã«èª¬æãããã¶ã€ããŒã®æ³ååãèªç±ã«çºæ®ã§ããã»ã©æè»ã§ãããšåæã«ãç¹å®ã®ã«ãŒã«ã«åŸã£ãŠãããå¶éã§ããã»ã©å³æ Œã§ãªããã°ãªããŸããã ããšãã°ãã³ã³ããã«ãã¿ã³ãé
眮ãããã®ãã¿ã³ã®é©åãªå Žæã«ã¢ã€ã³ã³ãé
眮ããããšãã§ããŸããããã¿ã³ãããã¹ããªã©ã«æ¿å
¥ããããšãããšãã³ã³ãã€ã©ã¯ãšã©ãŒãè¿ããŸãã
ããã«ãUIãèšè¿°ããèšèªã¯å€ãã®å Žå宣èšçã§ãããèŠãããã®ããšãã圢ã§ã€ã³ã¿ãŒãã§ãŒã¹ãèšè¿°ãããã¬ãŒã ã¯ãŒã¯èªäœã«ã©ã®ã³ãŒããšã©ã®ããã«å®è¡ããããçè§£ãããæ©äŒãäžããŸãã
äžéšã®èšèªã¯ãå
ã
ãã®ãããªã¿ã¹ã¯ãç®ã«ããŠéçºãããŸããããGoã§ã¯ãããŸããã Flutter on GoãæžãããšããŸãå¥ã®ã¿ã¹ã¯ã«ãªãããã§ãïŒ
ç¹ç°ãã©ãã¿ãŒ
Flutterã«æ
£ããŠããªãå Žåã¯ã次ã®é±æ«ã«æè²ãããªãèŠããããã¥ãŒããªã¢ã«ãèªãã ãããããšã匷ããå§ãããŸãã Flutterã¯ãééããªããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºã«ãããã²ãŒã ã®ã«ãŒã«ãé転ãããããã§ãã ãããŠãã¢ãã€ã«ã ãã§ãªããFlutterã¢ããªã±ãŒã·ã§ã³ããã€ãã£ãã®dekstopã¢ããªã±ãŒã·ã§ã³ããã³Webã¢ããªã±ãŒã·ã§ã³ãšããŠèµ·åããããã®ã¬ã³ãã©ãŒïŒFlutterã embedder ïŒãæ¢ã«ååšããŠããå¯èœæ§ãé«ãã§ã ã
åŠã¶ã®ã¯ç°¡åã§ãè«ççã§ã ãããªã¢ã«ãã¶ã€ã³ã®çŸãããŠã£ãžã§ããã®å·šå€§ãªã©ã€ãã©ãªãä»å±ããŠããã ãã§ãªããçŽ æŽãããã³ãã¥ããã£ãšåªãããã¥ãŒãã³ã°ãåããŠããŸãïŒGoã§ã®go build/run/test
ã go build/run/test
ãFlutterã§ã®æäœãç°¡åãªå Žåã¯ïŒåæ§ã®äœéšãåŸãããŸãïŒã
1幎åãç§ã¯å°ããªã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãæžãå¿
èŠããããŸããïŒãã¡ããiOSãšAndroidçšïŒãäž¡æ¹ã®ãã©ãããã©ãŒã çšã®é«å質ã®ã¢ããªã±ãŒã·ã§ã³ãéçºããè€éããéåžžã«å€§ããããšã«æ°ä»ããŸããïŒã¢ããªã±ãŒã·ã§ã³ã¯äž»ãªä»äºã§ã¯ãããŸããã§ããïŒ-ç§ã¯ãããå€éšå§èšãããéãæããªããã°ãªããŸããã§ããã å®éãã·ã³ãã«ã§ãããªããé«å質ã§ããã¹ãŠã®ããã€ã¹ã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããããšã¯ã20幎è¿ãã®ããã°ã©ãã³ã°çµéšããã人ã«ãšã£ãŠãäžå¯èœãªäœæ¥ã§ããã ãããŠãããã¯ç§ã«ãšã£ãŠåžžã«ãã³ã»ã³ã¹ã§ããã
Flutterã䜿çšããŠãååŸ3æã«ãã®ã¢ããªã±ãŒã·ã§ã³ãæžãçŽãããã¬ãŒã ã¯ãŒã¯èªäœããŒãããåŠã³ãŸããã 誰ãããããå°ãæ©ããããããªããšç§ã«èšã£ããªããç§ã¯ãããä¿¡ããŸããã
æ°ãããã¯ãããžãŒã®çºèŠã«ãã£ãŠçç£æ§ãåæ§ã«åäžããã®ã¯ã5幎åã«GoãçºèŠãããšãã§ããã ãã®ç¬éã¯ç§ã®äººçãå€ããŸããã
ã ããç§ã¯Flutterã®åŠç¿ãéå§ããããšããå§ãããŸãã
Flutterã®ãHelloãWorldã
flutter create
ã䜿çšããŠæ°ããã¢ããªã±ãŒã·ã§ã³ãflutter create
ãšãã¿ã€ãã«ãããã¹ããã«ãŠã³ã¿ãŒãããã³ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããã¿ã³ãæã€ãŸãã«ãã®ãããªããã°ã©ã ãåŸãããŸãã

ããã¯çŽ æŽãããäŸã ãšæããŸãã æ¶ç©ºã®Flutter on Goã«ãããæžããŸãã ã¢ã€ãã¢ããã¹ãã§ãããã¬ãŒã ã¯ãŒã¯ã®ã»ãŒãã¹ãŠã®åºæ¬æŠå¿µããããŸãã ã³ãŒããèŠãŠã¿ãŸãããïŒããã¯1ã€ã®ãã¡ã€ã«ã§ãïŒã
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); } }
ã³ãŒããéšåçã«åæããGoã«ãããã®ãšãã®æ¹æ³ãåæããŠãããŸããŸãªãªãã·ã§ã³ãèŠãŠã¿ãŸãããã
Goã§ã³ãŒãã翻蚳ããŸã
éå§ã¯ç°¡åã§ç°¡åã§ã-äŸåé¢ä¿ãã€ã³ããŒããã main()
颿°ãèµ·åããŸãã ããã§ã¯è€éãªããšãè峿·±ãããšã¯äœããããŸããã倿Žã¯ã»ãŒæ§æçãªãã®ã§ãã
package hello import "github.com/flutter/flutter" func main() { app := NewApp() flutter.Run(app) }
å¯äžã®éãã¯ã MyApp()
-MyAppãšããã¯ã©ã¹å
ã«é ãããŠããç¹å¥ãªé¢æ°ã§ããã³ã³ã¹ãã©ã¯ã¿ãŒã§ãã颿°ãèµ·åãã代ããã«ãé衚瀺ã§ã¯ãªãéåžžã®æç€ºçãªé¢æ°NewApp()
åŒã³åºãã ãã§ãã 圌女ã¯åãããšãããŸããããããäœã§ããããã©ã®ããã«å§ãŸããã©ã®ããã«æ©èœãããã説æãçè§£ããããšã¯ã¯ããã«æç¢ºã§ãã
ãŠã£ãžã§ããã¯ã©ã¹
Flutterã§ã¯ããã¹ãŠããŠã£ãžã§ããã§æ§æãããŠããŸãã DutterããŒãžã§ã³ã®Flutterã§ã¯ãåãŠã£ãžã§ããã¯ãFlutterãããŠã£ãžã§ããã®ç¹å¥ãªã¯ã©ã¹ãç¶æ¿ããã¯ã©ã¹ãšããŠå®è£
ãããŸãã
Goã«ã¯ã¯ã©ã¹ããªããããã«å¿ããŠã¯ã©ã¹éå±€ããããŸãããããã¯ãäžçããªããžã§ã¯ãæåã§ã¯ãªããããã«éå±€ãäœãããã§ãã ã¯ã©ã¹æåã®OOPã¢ãã«ã®ã¿ã«ç²ŸéããŠããããã°ã©ããŒã«ãšã£ãŠãããã¯å瀺ãããããŸããããå®éã«ã¯ããã§ã¯ãããŸããã äžçã¯ãæŠå¿µãããã»ã¹ãçžäºäœçšã®å·šå€§ãªç¹ã亀ããã°ã©ãã§ãã å®å
šã«æ§é åãããŠããããã§ã¯ãããŸããããæ··oticãšããŠããããã§ã¯ãããŸãããã¯ã©ã¹éå±€ã«ãããè©°ã蟌ãããšããããšã¯ãã³ãŒãããŒã¹ãèªã¿ã«ããäžåšçšã«ããæãä¿¡é Œã§ããæ¹æ³ã§ãã

Goã®äœæè
ããã®ãŠããã¿ã¹ãªã¯ã©ã¹ã®æŠå¿µãåèããã®ã«èŠåŽããGoã§å®è£
ãããOOPã®ã¯ããã«ã·ã³ãã«ã§åŒ·åãªæŠå¿µãå®è£
ãããããGoã¯æ¬åœã«æè¬ããŠããŸã ã
Goã§ã¯ãç¹å®ã®ã¿ã€ã-æ§é ã®åœ¢åŒã§æœè±¡åã衚ããŸãã
type MyApp struct {
MyApp
ããŒãžã§ã³ã®Flutterã§ã¯ã MyApp
ã¯StatelessWidget
ãç¶æ¿ãã build
ã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã ããã¯ã2ã€ã®åé¡ã解決ããããã«å¿
èŠã§ãã
- ãŠã£ãžã§ããïŒ
MyApp
ïŒã«ããã€ãã®ç¹å¥ãªããããã£/ã¡ãœãããäžããŸã - Flutterããã«ã/ã¬ã³ããªã³ã°ããã»ã¹ã§ã³ãŒããåŒã³åºãããšãã§ããããã«ããŸã
Flutterã®å
éšã¯ããããªãã®ã§ãã¢ã€ãã çªå·1ã¯åé¡ã§ã¯ãªãã®ã§ããããªããã°ãªããŸããã Goã«ã¯ããã®ããã®ãŠããŒã¯ã§æçœãªè§£æ±ºçããããŸãïŒ åã蟌ã¿åïŒ
type MyApp struct { flutter.Core
ãã®ã³ãŒãã¯ããã¹ãŠã®flutter.Core
ããããã£ãšã¡ãœãããMyApp
ã¿ã€ãã«è¿œå ãMyApp
ã ç§ã¯ãããWidget
代ããã«Core
ãšåŒã³ãŸããã第äžã«ãã¿ã€ãåã蟌ã¿ã¯MyApp
ãŸã ãŠã£ãžã§ããã«ããªãããã§ãã第äºã«ããã®ååã¯GopherJS Vectyãã¬ãŒã ã¯ãŒã¯ïŒGoå°çšã®Reactã®ãããªãã®ïŒã§éåžžã«ãã䜿çšãããŸãã VectyãšFlutterã®é¡äŒŒæ§ã«ã€ããŠã¯ãåŸã»ã©è§ŠããŸãã
2çªç®ã®ãã€ã³ã-Flutterãšã³ãžã³ã䜿çšã§ããbuild()
ã¡ãœããã®å®è£
ããGoã§ç°¡åãã€æç¢ºã«è§£æ±ºãããŸãã Goã®æ¶ç©ºã®Flutterã©ã€ãã©ãªã®ã©ããã§å®çŸ©ãããç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæºããç¹å®ã®ã·ã°ããã£ãæã€ã¡ãœããã远å ããã ãã§ãã
flutter.goïŒ
type Widget interface { Build(ctx BuildContext) Widget }
ãããŠä»ãmain.goïŒ
type MyApp struct { flutter.Core
ããã§ããã€ãã®éãã«æ°ä»ãããšãã§ããŸãïŒ
- ã³ãŒãã¯ããå°ãåé·ã§ã
BuildContext
ã Widget
ããã³MaterialApp
ã¯ããããã®åã«ããflutter
ã€ã³ããŒããæããŸãã - ã³ãŒãã¯å°ãæ ¹æ ãå°ãªã
@override
extends Widget
ã@override
ãããªèšèã¯ãããŸãã Build()
ã¡ãœããã¯å€§æåã§å§ãŸããŸããããã¯ãGoã®ã¡ãœããã®ã宣äŒããæå³ããããã§ãã Dartã§ã¯ãååãã¢ã³ããŒã¹ã³ã¢ïŒ_ïŒã§å§ãŸããã©ããã«ãã£ãŠå®£äŒã決å®ãããŸãã
ãããã£ãŠãFlutter on Goã§ãŠã£ãžã§ãããäœæããã«ã¯ã flutter.Core
åãåã蟌ã¿ã flutter.Widget
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããflutter.Widget
ãŸãã ç§ãã¡ã¯ãããçè§£ããããã«æãäžããŸããã
ç¶æ
ããã¯Flutterã§ç§ãæ¬åœã«æ··ä¹±ããããã®ã®1ã€ã§ããã StatelessWidget
ãšStatefulWidget
2ã€ã®ç°ãªãã¯ã©ã¹ããããŸãã ç§ã«é¢ããŠã¯ããã¹ããŒãã¬ã¹ãŠã£ãžã§ãããã¯åããŠã£ãžã§ããã§ãããããŒããããŒã¿ãç¶æ
ããããŸããããªãæ°ããã¯ã©ã¹ãèãåºãå¿
èŠãããã®ã§ããããã ãããã倧äžå€«ãç§ã¯ããã§çããããšãã§ããŸãã
ããããããã«-ããã«ãå¥ã®ã¯ã©ã¹ïŒ StatefulWidget
ïŒãç¶æ¿ããããšã¯ã§ããŸãããããã®ãããªéæ³ãèšè¿°ããå¿
èŠããããŸãïŒIDEãããªãã®ããã«ãããè¡ããŸããããã€ã³ãã¯è¡ããŸããïŒã
class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold() } }
ããŒããããã§äœãèµ·ãããèŠãŠã¿ãŸãããã
åºæ¬çã«ãã¿ã¹ã¯ã¯æ¬¡ã®ãšããã§ãããŠã£ãžã§ããïŒãã®å Žåã¯ã«ãŠã³ã¿ãŒïŒã«ç¶æ
ã远å ãããŠã£ãžã§ãããåæç»ããããã«ç¶æ
ã倿Žãããšãã«Flutterãšã³ãžã³ã«éç¥ããŸãã ãããåé¡ã®å®éã®è€éãã§ãïŒBrooksã®çšèªã§ã®æ¬è³ªçãªè€éãïŒã
ä»ã®ãã¹ãŠã¯å¶ç¶ã®è€éãã§ãã Dartã®Flutterã«ã¯ããžã§ããªãã¯ã䜿çšããŠãŠã£ãžã§ãããåãã©ã¡ãŒã¿ãŒãšããŠåãåãæ°ããState
ã¯ã©ã¹ããããŸãã æ¬¡ã«ã _MyHomePageState
ã¯ã©ã¹ã_MyHomePageState
ããã®ã¯ã©ã¹ã¯State MyApp
ãç¶æ¿State MyApp
... _MyHomePageState
ãããã§ãäœããã®æ¹æ³ã§ãã€ãžã§ã¹ãã§ããŸãã ãããããªããŠã£ãžã§ãããååšããã¯ã©ã¹ã§ã¯ãªããStateã¯ã©ã¹ã§build()
ã¡ãœãããå®çŸ©ãããŠããã®ã§ããããïŒ Brrr ....
Flutter FAQã«ã¯ãã®è³ªåã«å¯Ÿããçããããã ããã§ã¯çãçããååã«è©³çŽ°ã«æ€èšããŸã StatefulWidget
ç¶æ¿ãããšãã«ç¹å®ã®ã¯ã©ã¹ã®ãã°ãåé¿ããããã§ãã ã€ãŸããããã¯ã¯ã©ã¹æåã®OOPèšèšã®åé¡ã解決ããããã®åé¿çã§ãã ã·ãã¯ã
Goã§ãããã©ã®ããã«è¡ããŸããïŒ
第äžã«ãç§ã¯å人çã«ã¯ãå·ãã«å¥ã®ãšã³ãã£ãã£ãäœæããªãããšã奜ã¿ãŸã- State
ã çµå±ãç¹å®ã®ã¿ã€ãããšã«ãã§ã«ç¶æ
ããããŸã-ãããã¯æ§é äœã®åãªããã£ãŒã«ãã§ãã èšèªã¯ãããã°ãã®ãšãã»ã³ã¹ããã§ã«äžããŠãããŸããã åæ§ã®å¥ã®ãšã³ãã£ãã£ãäœæãããšãããã°ã©ããæ··ä¹±ããã ãã§ãã
ãã¡ããã課é¡ã¯ãFlutterã«ç¶æ
ã®å€åã«å¯Ÿå¿ããæ©èœãæäŸããããšã§ãïŒããã¯çµå±ããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã®æ¬è³ªã§ãïŒã ãããŠãéçºè
ã«ç¹å¥ãªé¢æ°ïŒ setState()
ïŒã®äœ¿çšããäŸé Œãã§ããå Žåãåãæ¹æ³ã§ããã€åæç»ãããããªããããšã³ãžã³ã«äŒããããã«ãç¹å¥ãªé¢æ°ã䜿çšããããã«äŸé Œã§ããŸãã æçµçã«ããã¹ãŠã®ç¶æ
ã®å€æŽãåæç»ãå¿
èŠãšããããã§ã¯ãããŸãããããã§ããã«å¶åŸ¡ã§ããŸãã
type MyHomePage struct { flutter.Core counter int }
ããŸããŸãªåœåãªãã·ã§ã³ãNeedsUpdate()
ããšãã§ããŸã-çŽæ¥æ§ãšãããããŠã£ãžã§ããããããã£ïŒ flutter.Core
ããflutter.Core
ïŒã§ãããšããäºå®ã®ããã«NeedsUpdate()
奜ãNeedsUpdate()
ããã°ããŒãã«flutter.Rerender()
ã¡ãœãããè¯ãããã§ãã 確ãã«ããŠã£ãžã§ããã¯ããã«åæç»ããããšãã誀ã£ãæèŠãäžããŸãããããã§ã¯ãããŸãã-次ã®ãã¬ãŒã æŽæ°ã§åæç»ãããã¡ãœããåŒã³åºãã®é »åºŠã¯ã¬ã³ããªã³ã°é »åºŠãããã¯ããã«é«ããªãå¯èœæ§ããããŸãããFlutterãšã³ãžã³ã¯æ¢ã«ãããåŠçã§ããã¯ãã§ã
ããããã¢ã€ãã¢ã¯ã远å ããããšãªãå¿
èŠãªåé¡ã解決ããã ãã§ãã
- æ°ããã¿ã€ã
- ãžã§ããªãã¯
- ç¶æ
ã®èªã¿åã/æžã蟌ã¿ã«é¢ããç¹å¥ãªèŠå
- ç¹å¥ãªæ°ãããªãŒããŒã©ã€ããããã¡ãœãã
ããã«ãAPIã¯ã¯ããã«æç¢ºã§çè§£ãããã-ã«ãŠã³ã¿ãŒãå¢ãããŠïŒä»ã®ããã°ã©ã ãšåãããã«ïŒãFlutterã«ãŠã£ãžã§ããã®åæç»ãäŸé ŒããŸãã ããã¯ãåã«setState
å Žåã«ã¯ããŸãæããã§ã¯ãªããã®ã§ããããã¯ãåã«ç¶æ
ãèšå®ããããã®ç¹å¥ãªé¢æ°ã§ã¯ãªãã颿°ïŒwtfïŒïŒãè¿ã颿°ã§ãã ç¹°ãè¿ãã«ãªããŸãããèšèªãšãã¬ãŒã ã¯ãŒã¯ã«é ãããéæ³ã¯ãã³ãŒãã®çè§£ãšèªã¿åããéåžžã«å°é£ã«ããŸãã
ç§ãã¡ã®å Žåãåãåé¡ã解決ããŸãããã³ãŒãã¯ããã·ã³ãã«ã§ã2åçããªããŸããã
ä»ã®ãŠã£ãžã§ããã®ç¶æ
ãŠã£ãžã§ãã
ãããã¯ã®è«ççãªç¶ããšããŠããç¶æ
ãŠã£ãžã§ããããFlutterã®å¥ã®ãŠã£ãžã§ããã§ã©ã®ããã«äœ¿çšãããããèŠãŠã¿ãŸãããã
@override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', home: MyHomePage(title: 'Flutter Demo Home Page'), ); }
ããã®MyHomePage
ã¯ãç¶æ
ãŠã£ãžã§ãããïŒã«ãŠã³ã¿ãŒãããïŒã§ããããã«ãäžã«ã³ã³ã¹ãã©ã¯ã¿ãŒMyHomePage()
åŒã³åºããŠäœæããŸã...åŸ
ã£ãŠãäœã§ããïŒ
build()
ã¯ããŠã£ãžã§ãããåæç»ããããã«åŒã³åºãããŸããã1ç§ã«äœåãå®è¡ãããå¯èœæ§ããããŸãã ã¬ã³ããªã³ã°äžã«æ¯åãç¹ã«ç¶æ
ãæã€ãŠã£ãžã§ãããäœæããå¿
èŠãããã®ã¯ãªãã§ããïŒ æå³ããããŸãã
Flutterã¯ããã®åæå/ç¶æ
管çãããã°ã©ããŒããé ãããã«ã Widget
ãšState
éã®ãã®åé¢ã䜿çšããããšãããããŸãïŒãã£ãšé ãããã®ããã£ãšïŒïŒã æ¯åæ°ãããŠã£ãžã§ãããäœæããŸããããã§ã«äœæãããŠããå Žåã¯èªåçã«ç¶æ
ãèŠã€ããŠãŠã£ãžã§ããã«æ·»ä»ããŸãã ãã®éæ³ã¯ç®ã«èŠããªããšããã§èµ·ãããã©ã®ããã«æ©èœããã®ãåãããŸãããã³ãŒããèªãå¿
èŠããããŸãã
ç§ã¯ã人éå·¥åŠã§æ£åœåããããšãå¯èœãªéãããã°ã©ããŒã«é ãããé ãããããããšã¯ãããã°ã©ãã³ã°ã®æ¬åœã®æªã ãšèããŠããŸãã å¹³åçãªçµ±èšããã°ã©ããŒã¯ããã®éæ³ãã©ã®ããã«æ©èœããããçè§£ããããã«Flutterã³ãŒããèªãŸããçžäºæ¥ç¶ã®æ¹æ³ãšå
容ãçè§£ããå¯èœæ§ã¯äœããšç¢ºä¿¡ããŠããŸãã
GoããŒãžã§ã³ã§ã¯ããã®ãããªé ããããœãŒãµãªãŒã¯çµ¶å¯Ÿã«æãŸãªãã§ãããããããšããããå°ãæ ¹æ ã®ãªãã³ãŒãã§ãã£ãŠããæç€ºçã§ç®ã«èŠããåæåã奜ãã§ãããã Dutterã«å¯ŸããFlutterã®ã¢ãããŒããå®è£
ã§ããŸãããéæ³ãæå°éã«æããããã«Goã倧奜ãã§ãããã¬ãŒã ã¯ãŒã¯ã§ãåãå²åŠãèŠãŠã¿ãããšæããŸãã ãããã£ãŠããŠã£ãžã§ããããªãŒã«ç¶æ
ãæã€ãŠã£ãžã§ããã®ã³ãŒãã¯ã次ã®ããã«èšè¿°ããŸãã
ãã®ã³ãŒãã¯ããŠã£ãžã§ããããªãŒããhomePage
ãåé€ããŠå¥ã®ãã®ã«çœ®ãæããå Žåã1ã€ã§ã¯ãªã3ã€ã®å Žæã§åé€ããå¿
èŠããããšããç¹ã§ãDartããŒãžã§ã³ã倱ãhomePage
ã ãããããã®èŠè¿ããšããŠãäœããã©ãã§ãã©ã®ããã«çºçããã®ããã¡ã¢ãªãã©ãã«å²ãåœãŠãããã®ãã誰ã誰ãåŒã³åºãã®ããªã©ã®å®å
šãªç»åãååŸããŸããæã®ã²ãã®ã³ãŒãã¯æç¢ºã§èªã¿ãããã§ãã
ã¡ãªã¿ã«ãFlutterã«ã¯StatefulBuilderã®ãããªãã®ããããŸããããã«ãããããã«éæ³ã远å ãããç¶æ
ããªã³ã¶ãã©ã€ã®ãŠã£ãžã§ãããäœæã§ããŸãã
DSL
ããã§ã¯ã楜ããããšãããŠã¿ãŸãããã Goã§ãŠã£ãžã§ããããªãŒãã©ã®ããã«è¡šçŸããŸããïŒ ç°¡æœã§ããããã§ããªãã¡ã¯ã¿ãªã³ã°ãšå€æŽãç°¡åã§ããŠã£ãžã§ããïŒèŠèŠçã«è¿ããè¿ãã«ããèšè¿°å
ã«ããå¿
èŠããããŠã£ãžã§ããïŒéã®ç©ºéçãªé¢ä¿ãèšè¿°ããåæã«ä»»æã®ã€ãã³ããã³ãã©ã®ãããªã³ãŒãã
Dartã®ãªãã·ã§ã³ã¯éåžžã«çŸããéåŒã§ããããã«æããŸãã
return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('You have pushed the button this many times:'), Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), );
åãŠã£ãžã§ããã«ã¯ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãåãå
¥ããã³ã³ã¹ãã©ã¯ã¿ãŒããããããã§ã¬ã³ãŒããæ¬åœã«çŽ æŽããããã®ã«ããŠããã®ã¯ã颿°ã®ååä»ããã©ã¡ãŒã¿ãŒã§ã ã
ååä»ããã©ã¡ãŒã¿ãŒ
ãã®çšèªã«æ
£ããŠããªãå Žåãå€ãã®èšèªã§ã¯ã颿°ã®äœçœ®ã¯é¢æ°ã«ãšã£ãŠéèŠã§ããããã颿°ã®ãã©ã¡ãŒã¿ãŒã¯ãäœçœ®ããšåŒã°ããŸãã
Foo(arg1, arg2, arg3)
ãããã³ååä»ããã©ã¡ãŒã¿ãŒã®å Žåããã¹ãŠãåŒã³åºãã®ååã«ãã£ãŠæ±ºå®ãããŸãã
Foo(name: arg1, description: arg2, size: arg3)
ããã¯ããã¹ãã远å ããŸããããã©ã¡ãŒã¿ãŒã®æå³ãçè§£ããããšããŠãã¯ãªãã¯ãä¿æããã³ãŒãå
ãç§»åããŸãã
ãŠã£ãžã§ããããªãŒã®å Žåãèªã¿ãããã«ãããŠéèŠãªåœ¹å²ãæãããŸãã äžèšãšåãã³ãŒãããååä»ããã©ã¡ãŒã¿ãŒãªãã§æ¯èŒããŸãã
return Scaffold( AppBar( Text(widget.title), ), Center( Column( MainAxisAlignment.center, <Widget>[ Text('You have pushed the button this many times:'), Text( '$_counter', Theme.of(context).textTheme.display1, ), ], ), ), FloatingActionButton( _incrementCounter, 'Increment', Icon(Icons.add), ), );
ããã§ã¯ãããŸããã ããïŒ çè§£ããã®ãé£ããã ãã§ã¯ãããŸããïŒåãã©ã¡ãŒã¿ãŒã®æå³ãšãã®ã¿ã€ããèŠããŠããå¿
èŠããããããã¯éèŠãªèªç¥çè² è·ã§ãïŒã ãã§ãªãã転éãããã©ã¡ãŒã¿ãŒãèªç±ã«éžæããããšãã§ããŸããã ããšãã°ããããªã¢ã«ã¢ããªã±ãŒã·ã§ã³ã«FloatingActionButton
ã䜿çšããããªãå ŽåããããŸãããã®ããããã©ã¡ãŒã¿ãŒã§FloatingActionButton
ãæå®ããªãã§ãã ããã ååä»ããã©ã¡ãŒã¿ãŒããªãå Žåãå¯èœãªãã¹ãŠã®ãŠã£ãžã§ããã匷å¶çã«æå®ãããããªãã¬ã¯ã·ã§ã³ã䜿çšããŠããžãã¯ã䜿çšããŠãã©ã®ãŠã£ãžã§ããã転éããããã調ã¹ãå¿
èŠããããŸãã
ãŸããGoã«ã¯é¢æ°ãšååä»ããã©ã¡ãŒã¿ãŒã®ãªãŒããŒããŒãããªããããããã¯Goã«ãšã£ãŠç°¡åãªã¿ã¹ã¯ã§ã¯ãããŸããã
GoãŠã£ãžã§ããããªãŒ
ããŒãžã§ã³1
Scaffoldãªããžã§ã¯ãã詳ããèŠãŠã¿ãŸããããããã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®äŸ¿å©ãªã©ãããŒã§ãã appBarãdraweãhomeãbottomNavigationBarãfloatingActionBarã®ããããã£ãããããããã¯ãã¹ãŠãŠã£ãžã§ããã§ãã ãŠã£ãžã§ããããªãŒãäœæãããšããå®éã«ã¯äœããã®æ¹æ³ã§ãã®ãªããžã§ã¯ããåæåããåè¿°ã®ãŠã£ãžã§ããããããã£ãæž¡ãå¿
èŠããããŸãã ããŠãããã¯ãªããžã§ã¯ãã®éåžžã®äœæãšåæåãšããŸãå€ãããªãã
é¡ã®ã¢ãããŒãã詊ããŠã¿ãŸãããïŒ
return flutter.NewScaffold( flutter.NewAppBar( flutter.Text("Flutter Go app", nil), ), nil, nil, flutter.NewCenter( flutter.NewColumn( flutter.MainAxisCenterAlignment, nil, []flutter.Widget{ flutter.Text("You have pushed the button this many times:", nil), flutter.Text(fmt.Sprintf("%d", m.counter), ctx.Theme.textTheme.display1), }, ), ), flutter.FloatingActionButton( flutter.NewIcon(icons.Add), "Increment", m.onPressed, nil, nil, ), )
æãçŸããUIã³ãŒãã§ã¯ãããŸããã flutter
ãšããèšèflutter
ã©ãã«ã§ããããå°ããŸãã é衚瀺ã«ããããã«ïŒå®éã«ã¯ã flutter
ã§ã¯ãªããæ¬è³ªã§ã¯ãªãããã±ãŒãžmaterial
ã«ååãä»ããå¿
èŠããããŸããïŒãååã®ãªããã©ã¡ãŒã¿ãŒã¯å®å
šã«æçœã§ã¯ãªãããããã®nil
ã¯ã©ãã§ãå
¬ç¶ãšæ··ä¹±ããŠããŸãã
ããŒãžã§ã³2
ããã§ããã»ãšãã©ã®ã³ãŒãã¯flutter
ããã±ãŒãžã®ããããã®ã¿ã€ã/颿°ã䜿çšãããããããããã€ã³ããŒãã圢åŒã䜿çšããŠããã±ãŒãžãããŒã ã¹ããŒã¹ã«ã€ã³ããŒãããããã±ãŒãžåããé ããããšãã§ããŸãã
import . "github.com/flutter/flutter"
flutter.Text
代ããã«ã Text
ã ããæžãããšãã§ããŸãã ããã¯éåžžãæªãç¿æ
£ã§ãããç§ãã¡ã¯ãã¬ãŒã ã¯ãŒã¯ã§äœæ¥ããŠããããã®ã€ã³ããŒãã¯æåéããã¹ãŠã®è¡ã«ãããŸãã ç§ã®ç·Žç¿ãããããã¯ãŸãã«ãã®ãããªã€ã³ããŒããåãå
¥ããããå Žåã§ã-äŸãã°ã GoConveyããã¹ãããããã«çŽ æŽããããã¬ãŒã ã¯ãŒã¯ã䜿çšãããšãã®ããã«ã
ã³ãŒããã©ã®ããã«èŠãããèŠãŠã¿ãŸãããïŒ
return NewScaffold( NewAppBar( Text("Flutter Go app", nil), ), nil, nil, NewCenter( NewColumn( MainAxisCenterAlignment, nil, []Widget{ Text("You have pushed the button this many times:", nil), Text(fmt.Sprintf("%d", m.counter), ctx.Theme.textTheme.display1), }, ), ), FloatingActionButton( NewIcon(icons.Add), "Increment", m.onPressed, nil, nil, ), )
ãã§ã«åªããŠããŸããããããã®nil-sãšååã®ãªããã©ã¡ãŒã¿ãŒ....
ããŒãžã§ã³3
æž¡ããããã©ã¡ãŒã¿ãŒãåæããããã«ãªãã¬ã¯ã·ã§ã³ïŒããã°ã©ã ã®å®è¡äžã«ã³ãŒããæ€æ»ããæ©èœïŒã䜿çšããå Žåã®ã³ãŒãã®å€èгãèŠãŠã¿ãŸãããã ãã®ã¢ãããŒãã¯ãGoã®åæã®HTTPãã¬ãŒã ã¯ãŒã¯ïŒããšãã°martini ïŒã§äœ¿çšãããŠãããéåžžã«æªããã©ã¯ãã£ã¹ãšèŠãªãããŸã-å®å
šã§ã¯ãªããåã·ã¹ãã ã®å©äŸ¿æ§ã倱ããæ¯èŒçé
ããã³ãŒãã«éæ³ã远å ããŸã-ããããå®éšã®ããã«è©Šãããšãã§ããŸãïŒ
return NewScaffold( NewAppBar( Text("Flutter Go app"), ), NewCenter( NewColumn( MainAxisCenterAlignment, []Widget{ Text("You have pushed the button this many times:"), Text(fmt.Sprintf("%d", m.counter), ctx.Theme.textTheme.display1), }, ), ), FloatingActionButton( NewIcon(icons.Add), "Increment", m.onPressed, ), )
æªãã¯ãããŸããããŸããDartã®ãªãªãžãã«ããŒãžã§ã³ã®ããã«èŠããŸãããååä»ããã©ã¡ãŒã¿ãŒãäžè¶³ããŠãããããå®éã«ç®ãçããªã£ãŠããŸãã
ããŒãžã§ã³4
å°ãæ»ã£ãŠãäœãããããšããŠããã®ãèªåããŠã¿ãŸãããã Dartã®ã¢ãããŒãããã¿ããã«ã³ããŒããå¿
èŠã¯ãããŸããïŒããã¯çŽ æŽãããããŒãã¹ã§ãããDartã®Flutterã«æ¢ã«ç²ŸéããŠãã人ã
ããåŠã¶ããšã¯å°ãªããªããŸãïŒã åºæ¬çã«ãæ°ãããªããžã§ã¯ããäœæããŠããããã£ãå²ãåœãŠãã ãã§ãã
ãã®æ¹æ³ã§è©Šãããšãã§ããŸããïŒ
scaffold := NewScaffold() scaffold.AppBar = NewAppBar(Text("Flutter Go app")) column := NewColumn() column.MainAxisAlignment = MainAxisCenterAlignment counterText := Text(fmt.Sprintf("%d", m.counter)) counterText.Style = ctx.Theme.textTheme.display1 column.Children = []Widget{ Text("You have pushed the button this many times:"), counterText, } center := NewCenter() center.Child = column scaffold.Home = center icon := NewIcon(icons.Add), fab := NewFloatingActionButton() fab.Icon = icon fab.Text = "Increment" fab.Handler = m.onPressed scaffold.FloatingActionButton = fab return scaffold
ãã®ã¢ãããŒãã¯æ©èœãããååä»ããã©ã¡ãŒã¿ãŒãã®åé¡ã解決ããŸããããŠã£ãžã§ããããªãŒã®å
šäœåãæ··ä¹±ãããŸãã ãŸãããŠã£ãžã§ãããå®çŸ©ããé åºãéã«ãªããŸãããŠã£ãžã§ãããæ·±ããªãã»ã©ããŠã£ãžã§ãããæ©ãäœæããå¿
èŠããããŸãã 第äºã«ãã³ãŒãã®äŸ¿å©ãªèŠèŠçæ§é ã倱ããŸãããã€ã³ãã³ãã䜿çšããŠããããªãŒå
ã®ãŠã£ãžã§ããã®æ·±ããããã«ããããŸãã
ãšããã§ããã®ã¢ãããŒãã¯GTKãQtã®ãããªUIãã¬ãŒã ã¯ãŒã¯ã§é·ãé䜿çšãããŠããŸããã , , Qt 5:
QGridLayout *layout = new QGridLayout(this); layout->addWidget(new QLabel(tr("Object name:")), 0, 0); layout->addWidget(m_objectName, 0, 1); layout->addWidget(new QLabel(tr("Location:")), 1, 0); m_location->setEditable(false); m_location->addItem(tr("Top")); m_location->addItem(tr("Left")); m_location->addItem(tr("Right")); m_location->addItem(tr("Bottom")); m_location->addItem(tr("Restore")); layout->addWidget(m_location, 1, 1); QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); layout->addWidget(buttonBox, 2, 0, 1, 2);
, - . , , , .
5
, â -. äŸïŒ
func Build() Widget { return NewScaffold(ScaffoldParams{ AppBar: NewAppBar(AppBarParams{ Title: Text(TextParams{ Text: "My Home Page", }), }), Body: NewCenter(CenterParams{ Child: NewColumn(ColumnParams{ MainAxisAlignment: MainAxisAlignment.center, Children: []Widget{ Text(TextParams{ Text: "You have pushed the button this many times:", }), Text(TextParams{ Text: fmt.Sprintf("%d", m.counter), Style: ctx.textTheme.display1, }), }, }), }), FloatingActionButton: NewFloatingActionButton( FloatingActionButtonParams{ OnPressed: m.incrementCounter, Tooltip: "Increment", Child: NewIcon(IconParams{ Icon: Icons.add, }), }, ), }) }
ããïŒ , . ...Params
, . , , Go , , .
-, ...Params
, . (proposal) â " " . , FloatingActionButtonParameters{...}
{...}
. :
func Build() Widget { return NewScaffold({ AppBar: NewAppBar({ Title: Text({ Text: "My Home Page", }), }), Body: NewCenter({ Child: NewColumn({ MainAxisAlignment: MainAxisAlignment.center, Children: []Widget{ Text({ Text: "You have pushed the button this many times:", }), Text({ Text: fmt.Sprintf("%d", m.counter), Style: ctx.textTheme.display1, }), }, }), }), FloatingActionButton: NewFloatingActionButton({ OnPressed: m.incrementCounter, Tooltip: "Increment", Child: NewIcon({ Icon: Icons.add, }), }, ), }) }
Dart! .
6
, . , , , , .
, , , -, â :
button := NewButton(). WithText("Click me"). WithStyle(MyButtonStyle1)
ãŸãã¯
button := NewButton(). Text("Click me"). Style(MyButtonStyle1)
Scaffold- :
Go â , . Dart-, :
New...()
â , . , â " , , , , , , â " .
, , 5- 6- .
"hello, world" Flutter Go:
main.go
package hello import "github.com/flutter/flutter" func main() { flutter.Run(NewMyApp()) }
app.go:
package hello import . "github.com/flutter/flutter"
home_page.go:
package hello import ( "fmt" . "github.com/flutter/flutter" )
!
ãããã«
Vecty
, , Vecty . , , , , Vecty DOM/CSS/JS, Flutter , 120 . , Vecty , Flutter Go Vecty .
Flutter
â , . Flutter, .
Go
" Flutter Go?" "" , , , , , Flutter, , , "" . , Go .
, Go . . Go, , , -. â , , .
Go. â , .
Flutter
, Flutter , , . "/ " , Dart ( , , ). Dart, , (, ) DartVM V8, Flutter â Flutter -.
, . . , , 1.0 . , - .
game changer, Flutter , , .
UI â Flutter, .
åç
§è³æ