
ïŒ*ãã©ãã¿ãŒãšããèšèã®æå³ã®1ã€ã¯ããã©ãã¿ãŒããããšã§ãïŒ
å Žåãææ¡ äººç Flutterã¢ããªã±ãŒã·ã§ã³ã§ã®ç¶æ
ã®ä¿åã OSãåèµ·åã決å®ããå Žåã¯ã©ããªããŸããã ãŠãŒã¶ãŒå
¥åãšããã²ãŒã·ã§ã³ã¯ã©ãã«è¡ããã©ã®ããã«å¯ŸåŠãããã
å
責äºé
ïŒ
- ç解ããã«ã¯ãFlutterã®åºæ¬çãªç¥èãå¿
èŠã§ãã
- ç§ã¯Androidã®èŠ³ç¹ãããiOSã«ã€ããŠè°è«ããŸã-ããã¯ç§ã®ããã§ã¯ãããŸããã
- ç§ã¯Flutter / Dartã®ã¹ãã·ã£ãªã¹ãã§ã¯ãªããåå¿è
ã§ãã
- ããã€ãã®å Žæã§ã¯ããã€ããŒãã€ã³ãïŒããšãã°ãè£å©é¢æ°ã®å®è£
ïŒãçç¥ããŠããŸããã å®å
šãªãããžã§ã¯ãã³ãŒãã§æ¬ èœããŠããç®æãèŠã€ããããšãã§ããŸãã
ãã©ãã¿ãŒãšã¯
ã¯ãã¹ãã©ãããã©ãŒã ã¢ãã€ã«ã¢ããªéçºã®ãã¬ãŒã ã¯ãŒã¯ã§ããFlutterã¯ãGoogle I / O 17ã§çºè¡šãããŸããã
Flutterã¯Cããã³C ++ã§äœæãããã¬ã³ããªã³ã°çšã«ç¬èªã®2Dãšã³ãžã³ãå®è£
ããŸãïŒWebViewã¯äœ¿çšãããŸããïŒã Reactã«äŒŒããã®ã§ãéçºã¯Dartèšèªã§è¡ãããŸãã ã³ãŒãã¯1åäœæãããã¢ã»ã³ããªäžã«ãã©ãããã©ãŒã ããšã«ãã€ãã£ãã«ã³ã³ãã€ã«ãããŸãã
ãªããã©ãã¿ãŒïŒ
ãã©ãã¿ãŒïŒä»¥äžãã©ãã¿ãŒãšåŒã³ãŸãïŒã«ã¯å©ç¹ã®ãªã¹ãããããŸãïŒ
- ã¯ãã¹ãã©ãããã©ãŒã ïŒã³ãŒãã®åå©çšã«ãããéçºã«è²»ããæéãå°ãªããªããŸããã
- äœæ¥é床 ïŒãã€ãã£ãã³ãŒããžã®AOTã³ã³ãã€ã«ã
- ã³ã³ããŒãã³ãã®ã»ãã ïŒMaterial Designããã³Cupertinoã®ã¹ã¿ã€ã«ã«ã¯å€ãã®æšæºãŠã£ãžã§ããããããŸãã
- ããããªããŒã ïŒåã³æéãç¯çŽããŸãã
è³åŠäž¡è«ãé¿ããããã«ããã¡ããããã¹ãŠã®ã¿ã¹ã¯ãå®å
šã«è§£æ±ºããã®ã«é©ããããŒã«ãéžæããããšã¯ã§ããŸãããåããŒã«ã¯ãã®ã³ã³ããã¹ãã«é©ããŠããŸãã ãã©ãã¿ãŒã¯ãæ¡ä»¶ä»ãã§ãå
žåçãªãã€ã³ã¿ãŒãã§ãŒã¹ãšäœ¿çšã·ããªãªãæã€å°èŠæš¡ãããžã§ã¯ãã«äœ¿çšãããšäŸ¿å©ã ãšæããŸãã ãã®å Žåã圌ã¯ããã»ã¹ã倧å¹
ã«ççž®ããã«ãŒãã³äœæ¥ã®å¿
èŠæ§ãæé€ããŸãïŒ2ã€ã®ãã©ãããã©ãŒã ã«åãã³ãŒããèšè¿°ãããiosã®å Žåãšåãããã«Androidã§ãããããšããïŒã
Flutterã䜿çšããŠãåé¡ã¯äœã§ããïŒ
ããã€ãã®ç¹ãå¿é
ã§ãã çç£ã®ããã«äœããæ¥ãåã«ãããããæ確ã«ããå¿
èŠããããŸãã
- ã©ã€ããµã€ã¯ã«;
- 建ç¯
- æ¬åœã«ãããªã«éãã®ïŒ
é çªã«å§ããŸãããã ãã®èšäºã§ã¯ãã©ã€ããµã€ã¯ã«ã®åé¡ãæ±ããŸãã ãã¶ããç§ã¯ã¢ã³ããã€ãéçºè
ã®å
žåçãªåŠæ³ãæã£ãŠããŸãã æ°ãã解決çãèŠã€ãããšãã«æåã«é ã«æµ®ãã¶ã®ã¯ããåœå®¶ã®ä¿åãä¿èšŒããŸããïŒ æŽ»å家ãæ»ãã ãã©ããªããŸããïŒ ãããŠãããç³è«ããã»ã¹ãæ»ãã ãïŒã
ã¹ããŒããã«ãã©ãã¿ãŒã®æ©èœãèŠãŠã¿ãŸããã
ãããããããã§ãã¯ããŠãã ããïŒ codlabããå°ããªãã¢ãããžã§ã¯ããäœæããŸãã ããã¯ãã©ã³ãã ã«çæãããåèªããªã¹ãã«è¡šç€ºããã¢ããªã±ãŒã·ã§ã³ã§ãã ã¹ã¯ããŒã«ãããšãæ°ããåèªãè¿œå ãããããããªã¹ãã¯æ¡ä»¶ä»ãã§ç¡éã«ãªããŸãã ãããã®åèªããæ°ã«å
¥ãã«è¿œå ããŠãå¥ã®ç»é¢ã§ãæ°ã«å
¥ãã衚瀺ããããšãã§ããŸãã
[ã¢ã¯ãã£ããã£ãä¿æããªã]ãã§ãã¯ããã¯ã¹ããªã³ã«ããŠãéå§ãæãããã¿ãå±éã...ãã³ãŽïŒ ãŸããããã¯ãŸã£ããå察ã§ãããç§ã®æ²èŠ³äž»çŸ©è
ã¯ãããªãã«èŠåããŸããããšèšãã圌ã®æãããããŸãã
äœãèµ·ãã£ãŠããã®ãïŒ
- åèªãªã¹ããåäœæãããŸãã
- ããæ°ã«å
¥ããã¯ãªã»ãããããŸãã
- ã¹ã¯ããŒã«äœçœ®ã¯ä¿åãããŸããã
- ããã²ãŒã·ã§ã³ã¯ä¿åãããŸããïŒ2çªç®ã®ç»é¢ã«é
眮ãããå±éããããšæåã«è¡šç€ºãããŸãïŒ
æåã®2ç¹ïŒåèªã®ãªã¹ããæ°ãã«äœæãããããæ°ã«å
¥ããããªã»ãããããŸãïŒã§ãã¹ãŠãæŽããŸãã-ããã¯ããžãã¹ããžãã¯ã«é¢ãããã®ã§ããã®ãããªãã®ããã¬ãŒã ã¯ãŒã¯ããä¿åãããããšã¯èª°ãæåŸ
ããŠããŸããã ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãæ瀺çã«åèµ·åãããŸã§åèªãä¿åãããå Žåã¯ãå
±æèšå®ã ãã§ããã©ããã«ä¿åããŸãã
3çªç®ã®ãã€ã³ãïŒã¹ã¯ããŒã«äœçœ®ã¯ä¿åãããŸããïŒ -éåžžã®ããã§ãã åèµ·åæã«ããŒã¿ãã©ããªããã¯ããããŸãããããã«ä¿åããå¿
èŠã¯ãªããããããŸããã ã¯ããRecyclerViewã¯ã¹ã¯ããŒã«äœçœ®ãèªåçã«ä¿åããŸããã
èå³ã®ããã«ãTextFieldïŒEditTextã®ã¢ããã°ïŒã§äœãèµ·ãããã確èªããŸããã ãã®ãããªç¶æ³ã§ã¯ãããããã®ãŠãŒã¶ãŒå
¥åãæ¶ããããšãå€æããŸããããããã¯å®å
šã«æªãããã§ãã 次ã«ãå
¥åãå¯èœã«ããä»ã®ãŠã£ãžã§ããïŒã¹ã©ã€ããŒãã¹ã€ããã£ãŒããã§ãã¯ããã¯ã¹ãªã©ïŒã調ã¹ãŠã¿ãŸããã
ããã§ã¯ãååãšããŠãå
¥åæ§æã®ããžãã¯ããããã«ç°ãªãïŒAndroidãšã¯ç°ãªãïŒããšãããããŸããã åºæ¬çã«ããŠã£ãžã§ããã¯ãŠãŒã¶ãŒå
¥åãä¿åããŸããã ã€ãŸãããã§ãã¯ããã¯ã¹ãçªããšããã§ãã¯ããŒã¯ã¯è¡šç€ºãããŸããã 衚瀺ããã«ã¯ããã®ããã«å¥ã®ãã£ãŒã«ããäœæãããŠã£ãžã§ããã«è»¢éããŠãã¯ãªãã¯ã€ãã³ãã®ãã£ãŒã«ããå€æŽããå¿
èŠããããŸãã ãã£ãŒã«ãã®å€æŽ->ã¬ã³ããªã³ã°ã®å€æŽã
ããã«ãã§ãŒã³ãæ§ç¯ãããšããããã®ãã£ãŒã«ãã®å€ãç¶æ
ãšãšãã«å€±ããããšããŠãŒã¶ãŒå
¥åããªã»ãããããŸãã
äžå¿«ãªãã¥ãŒã¹ïŒãããã®ãã£ãŒã«ããã¡ã¢ãªãã£ãã·ã¥å
ã®ã©ããã«ä¿åãããšãããã»ã¹ãåèµ·åãããšå€±ãããŸãã ããã«ãããããDartã®ã©ããã«ïŒã·ã³ã°ã«ãã³ã§ãã£ãŠãã¯ã©ã¹ã®ãã£ãŒã«ãã«ïŒä¿åãããšãã¢ã¯ãã£ããã£ãåèµ·åããŠã倱ãããŸãã
ãã ããåããå€æŽãããšããã¹ãŠãæ£åžžã«ãªããŸãã ãã©ãã¿ãŒã®å
éšã§ã¯ã1ã€ã®ã¢ã¯ãã£ããã£ã«1ã€ã®ãã¥ãŒãããããã¹ãŠã®ã¬ã³ããªã³ã°ãè¡ãããŸãã ãŸããåããå€æŽããŠãããã®ã¢ã¯ãã£ããã£ã¯åäœæãããŸããã
4çªç®ã®ãã€ã³ãïŒããã²ãŒã·ã§ã³ã¯ä¿åãããŸããïŒ -éåžžã«æ®å¿µã§ãã Androidã¯ããã²ãŒã·ã§ã³ãä¿æããŸããããã©ãã¿ãŒã¯çºçããŸããã
ç§ã¯ã°ãŒã°ã«ã«è¡ãããããèŠã€ããŸãïŒ
aïŒãã®è³ªåãããã®ã¯ç§ã ãã§ã¯ãããŸããã人ã
ã¯githubã§ããã«ã€ããŠæŽ»çºã«è°è«ããŠããŸãã
bïŒãã©ãã¿ãŒäœæè
ã¯ãããã²ãŒã·ã§ã³/ã¹ããŒã¿ã¹ãä¿åããããã«ãŸã äœãããŸããã éçºè
ãèªåã§ãããåŠçã§ããããã«ããŸãã
åçãåŒçšããã«ã¯ïŒ
çŸåšããããç°¡åã«ããããã«äœãããŠããŸããã ãã®åé¡ã«ã€ããŠã¯ãŸã 詳ãã調æ»ããŠããŸããã ä»ã®ãšãããæåââã§ä¿æãããæ
å ±ãä¿åããã¢ããªã埩å
ããããšãã«æ°ãã«é©çšããããšããå§ãããŸãã
ãã©ãã«ã®åèšïŒ
- ãŠã£ãžã§ããã®ç¶æ
ãã©ããã«é
眮ããŠãã¢ã¯ãã£ããã£ã®åèµ·åã®éã«å埩ããå¿
èŠããããŸãã
- äœããã®æ¹æ³ã§ããã²ãŒã·ã§ã³ãä¿åããå¿
èŠããããŸãã
ç¶æ
ãç¶æããããšããŠããŸã
ããã解決ããå®äŸ¡ãªæ¹æ³ããããã©ããèŠãŠã¿ãŸãããã æŠå¿µå®èšŒãå¿
èŠã§ãã ããã«ã¡ã¯ïŒ
äŸãšããŠãç§ã¯ã³ãŒãã©ãã®ãã¢ã¢ããªã±ãŒã·ã§ã³ãèŠããç¶ããŸãã ã¿ã¹ã¯ïŒããã²ãŒã·ã§ã³ãšãŠãŒã¶ãŒå
¥åãä¿åããŸãã ãã®å Žåãè€éã«ãªããªãããã«ããŠãŒã¶ãŒå
¥åãã¹ã¯ããŒã«äœçœ®ã«ããŸãã ããã«ãçæãããåèªãšããæ°ã«å
¥ãããå
±æèšå®ã«ä¿åããŸãããããã¯ãããã¯ã«ã¯é©çšãããŸããã説æããŸããã
ãã¢ãå°ãå€æŽããŠå¯ŸåŠããããããŸãããã©ã³ãã ãªåèªãå«ããŠã£ãžã§ãããå¥ã®ãã¡ã€ã«ã«ç§»åããWordPairãè¡ã«çœ®ãæããŸããã
+ã³ãŒãã©ãã§è©³ãã説æãããŠãããã¹ãŠã®ããšã¯ãããã§ã¯ç¹°ãè¿ããŸããã åºæ¬ååãã¢ããªã±ãŒã·ã§ã³ã®æ§é ããŠã£ãžã§ããããªãŒãåèªã®ãªã¹ãã圢æããããžãã¯ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
ãŠãŒã¶ãŒå
¥åãšããã²ãŒã·ã§ã³ããã³ãã«ã«ä¿åãããïŒã¢ã¯ãã£ããã£ã1ã€ãããªãããšã«æ³šæããŠãã ããïŒã åœç¶ãDartãšAndroidéã®éä¿¡ãå¿
èŠã«ãªããŸãã ãããä¿®æ£ããæ¹æ³ãç解ããŸãããïŒ ããã¥ã¡ã³ããŒã·ã§ã³ ïŒã ãã©ãã¿ãŒãµã€ãã§ã¯ãMethodChannelãäœæããå¿
èŠããããŸãã
save(String key) async { const platform = const MethodChannel('app.channel.shared.data'); platform.invokeMethod("save", /* */); }
ãããŠãAndroidåŽã§ãåãååã®MethodChannelãäœæããŸãã
MethodChannel(getFlutterView(), "app.channel.shared.data") .setMethodCallHandler { call, result -> if (call.method.contentEquals("save")) {
ããŒã¿ãä¿å/éä¿¡ãã圢åŒã¯äœã§ããïŒ DartåŽã§ã¯ãããã¯äœã§ããããMethodChannelãä»ããŠä»»æã®ã¿ã€ããæž¡ãããšãã§ããŸãã ããããAndroidåŽã§ã¯ããã³ãã«ã«å
¥ããåäžãªãã®ãæ±ããããšæããŸãã å§ããã«ã¯ãjsonãjsonã®è¡ããã³ãã«ã®è¡ã§ããŒã¿ïŒãšã«ããïŒãè©ŠããŸãã
å
¥åãä¿å
ãŸãããŠãŒã¶ãŒå
¥åãåŠçããŸãããã ç¶æ
ã«é¢ããããŒã¿ãä¿åããæœè±¡ã¯ã©ã¹ãäœæããŸãã
abstract class Restorable { save(String key); Future<Restorable> restore(String key); }
ç¹å®ã®Restorableãç¹å®ã®ãŠã£ãžã§ããã«ãããããã«ã¯ãããŒåŒæ°ãå¿
èŠã§ãã ã€ãŸãããŠã£ãžã§ãããäœæãããšãã«ããŠã£ãžã§ããã«äžæã®ããŒãäžããå¿
èŠããããŸãã
ã¹ã¯ããŒã«äœçœ®ãç¶æããããã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
class RandomWordsInput implements Restorable { double scrollPosition = -1.0; RandomWordsInput(); save(String key) async { String json = JSON.encode(this); const platform = const MethodChannel('app.channel.shared.data'); platform.invokeMethod("saveInput", {"key": key, "value": json}); } Future<RandomWordsInput> restore(String key) async { const platform = const MethodChannel('app.channel.shared.data'); String s = await platform.invokeMethod("readInput", {"key" : key}); if (s != null) { var restoredModel = new RandomWordsInput.fromJson(JSON.decode(s)); scrollPosition = restoredModel.scrollPosition; } else { _empty(); } return this; } _empty() { scrollPosition = 0.0; } }
æäœæ¥ã§ã·ãªã¢ã«åãèšè¿°ããªãããã«ãjson_annotationã©ã€ãã©ãªãŒã䜿çšããŸãã 䜿çšæ¹æ³ã¯ãã©ãã¿ãŒãµã€ãã§èª¬æãããŠããŸã ã
ã¢ã¯ãã£ããã£ã®AndroidåŽã§ãããŒã¿ãä¿åããããã®ãã£ãŒã«ããäœæããŸãã
var savedFromFlutter: MutableMap<String, String> = mutableMapOf()
onCreateã§ã¡ãœããã転éããŸãïŒ
MethodChannel(getFlutterView(), "app.channel.shared.data").setMethodCallHandler { call, result -> if (call.method.contentEquals("save")) { savedModels.put(call.argument<String>("key"), call.argument<String>("value")) } else if (call.method.contentEquals("read")) { result.success(savedModels.get(call.argument<String>("key"))) } }
ãããŠãä¿å/埩å
ãè¡ããŸãïŒ
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putParcelable("savedFromFlutter", toBundle(savedModels)); } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) savedModels = fromBundle(savedInstanceState.getParcelable<Bundle>("savedFromFlutter")) }
ããã§ãRestoreableã䜿çšããŠä¿åããã³åŸ©å
ãããããŠã£ãžã§ããã«æããå¿
èŠããããŸãã ãã®äŸã§ã¯ãRandomWordsãŠã£ãžã§ããããããŸãã
class RandomWords extends StatefulWidget { @override createState() => new RandomWordsState(); }
ãããŠåœŒã®ç¶æ
ã¯æ¬¡ã®ããã«ãªããŸãã
class RandomWordsState extends State<RandomWords> { final _suggestions = <WordPair>[]; Widget _buildSuggestions() { return new ListView.builder( padding: const EdgeInsets.all(16.0), itemBuilder: (context, i) { if (i.isOdd) return new Divider(); final index = i ~/ 2; // If you've reached the end of the available word pairings... if (index >= _suggestions.length) { // ...then generate 10 more and add them to the suggestions list. _suggestions.addAll(generateWordPairs().take(10)); } return _buildRow(_suggestions[index]); } ); } }
ãŠã£ãžã§ãããäœæãããšããããŒãæž¡ããŸãïŒ
class RandomWords extends StatefulWidget { final String stateKey; RandomWords(this.stateKey); @override createState() => new RandomWordsState(); }
RandomWordsStateã§ã¯ãå·ã®äžã«ãã£ãŒã«ããäœæããŸãã
class RandomWordsState extends State<RandomWords> { RandomWordsInput input = new RandomWordsInput(); RandomWordsState() { _init(); } // ⊠}
ã¹ã¯ããŒã«äœçœ®ãå¶åŸ¡ããã«ã¯ãScrollControllerãå¿
èŠã§ãã
final ScrollController scrollController = new ScrollController();
_initïŒïŒé¢æ°ã¯ä¿åãããç¶æ
ãèªã¿åããã¹ã¯ããŒã«ã次ã®äœçœ®ã«ç§»åããŸãã
_init() async { RandomWordsInput newInput = await model.read(widget.stateKey); setState(() { input = newInput; scrollController.jumpTo(input.scrollPosition); }); }
ãŠã£ãžã§ãããæ§ç¯ããããã®æ©èœã次ã®ããã«å€æŽãããŸããã
Widget _buildSuggestions() { return new NotificationListener( onNotification: _onNotification, child: new ListView.builder( padding: const EdgeInsets.all(16.0), controller: scrollController, itemBuilder: (context, i) { // ⊠} ),); }
_onNotificationé¢æ°ã¯ãã¹ã¯ããŒã«äœçœ®ãæŽæ°ããŸãã
_onNotification(Notification n) { input.scrollPosition = scrollController.position.pixels; input.save(widget.modelKey); }
ãã®ãŠã£ãžã§ããã¯ã次ã®ããŒã§äœæãããŸãïŒ
class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: new RandomWords("list"), ); } }
ããã§ãã¢ã¯ãã£ããã£ã®åééã§ã¹ã¯ããŒã«ã®äœçœ®ãä¿åãããŸãã
ããã²ãŒã·ã§ã³ãä¿åãã
ãŸãããã®äŸã§ã¯å¥ã®ç»é¢ãžã®é·ç§»ãå°ãæžãçŽããååä»ãã«ãŒãã䜿çšããŸãïŒ ããã¥ã¡ã³ãã§èª¬æãããŠããŸã ïŒã
ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã«ãã«ãŒãããªã¹ãããŸãïŒ1ã€ãããããŸããïŒã
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: 'Flutter Demo', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new MyHomePage(title: 'Startup Name Generator'), routes: <String, WidgetBuilder>{ '/saved': (BuildContext context) => new SavedPage(title: 'Saved Suggestions'), }, ); } }
é·ç§»å±¥æŽãä¿æããã¯ã©ã¹ãäœæããŸãã
class Routes { static Queue<String> routes = new Queue<String>(); static var _firstTime = true; }
Restorableãšåæ§ã«ãä¿åãšåŸ©å
ã®æ¹æ³ãäœæããŸãã
static save() async { const platform = const MethodChannel('app.channel.shared.data'); platform.invokeMethod( "saveInput", {"key": "routes", "value": JSON.encode(routes.toList())}); } static restore(BuildContext context) async { if (!_firstTime) { return; } const platform = const MethodChannel('app.channel.shared.data'); String s = await platform.invokeMethod("readInput", {"key": "routes"}); if (s != null) { routes = new Queue<String>(); routes.addAll(JSON.decode(s)); } _firstTime = false; for (String route in routes) { Navigator.of(context).pushNamed(route); } }
ã€ãŸãã埩å
ãããšãã¯ãä¿åããããã¹ãŠã®ã«ãŒããååŸãããããããç»é¢ã®ãã§ãŒã³ã埩å
ããã ãã§ãã
ãæ°ã«å
¥ãã䜿çšããŠç»é¢ã«ç§»åããŠã«ãŒããä¿åããå Žåãããã³æ»ã£ãŠåé€ããå Žåã¯ããã®ãŸãŸæ®ããŸãã 移è¡ã§ã¯ããã¹ãŠãç°¡åã§ãããããè¡ãé¢æ°ãç·šéããŸãã
void _pushSaved() async { Routes.routes.addLast('/saved'); await Routes.save(); Navigator.of(context).pushNamed('/saved'); }
ãããããªããã ãŠãŒã¶ãŒããæ»ãããã¯ãªãã¯ããç¬éããã£ããããã«ã¯ãWillPopScopeã®ããæ°ã«å
¥ããã§ç»é¢äžã®ãŠã£ãžã§ãããã©ããããå¿
èŠããããŸãã ãŸãããæ»ãããæŒãåŠçãè¡ãé¢æ°ïŒããã§ã¯_onWillPopïŒãååŸããŸãã
class _SavedPageState extends State<SavedPage> { @override Widget build(BuildContext context) { // ⊠return new Scaffold( appBar: new AppBar( title: new Text('Saved Suggestions'), ), body: new WillPopScope( onWillPop: _onWillPop, child: new ListView(children: divided),), ); } Future<bool> _onWillPop() async { Routes.routes.removeLast(); await Routes.save(); return true; } }
ãŸããå€æå±¥æŽã埩å
ããå¿
èŠããããŸãã ã¡ã€ã³ç»é¢ã§ãã£ãŠã¿ãŸãããïŒ
class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { Routes.restore(context); // ⊠} // ⊠}
以äžã§ãïŒ ããã§ãããã²ãŒã·ã§ã³ãšã¹ã¯ããŒã«äœçœ®ã®äž¡æ¹ãä¿åãããŸãã
Flutterã䜿çšãã
ããã²ãŒã·ã§ã³ãããã«ä¿åã§ããªãããšã¯éåžžã«å¥åŠã ãšç§ã«ã¯æããŸãã ãŠãŒã¶ãŒå
¥åãä¿åããªãããããªãã¯ãŸã è°è«ããããšãã§ããŸãã çªç¶ãã¯ãŒãã¿ãŒæã®ããã€ã¹ã®ä¿åãšãããã€ã¹ãç Žå£ããããšãã®ã¢ã¯ãã£ããã£ã®æ倱ã«æºè¶³ããŠãããšèª°ããæãã ç§ã¯å¹žãã§ã¯ãããŸããã
ãã©ãã¿ãŒéçºè
ãããã§äœãã決å®ãããã©ããã¯ãŸã æããã§ã¯ãããŸããããgithubã§ã¯éåžžã«æŽ»çºãªå£é ã®æŠãããããŸãã
çŸæç¹ã§ã¯ãç¶æ
ã®ä¿åãèªåã§è¡ãããšã¯ããªãå¯èœã§ãã ãã¡ãããå®åæãå€ãããããã«èŠããŸããã
ãšãããããç§ã¯ãã©ãã¿ãŒãããã«ç 究ããŠãæ®ãã®çåãé£ã³å»ããã©ããã確èªããããšæã£ãŠããŸãã ãããŠããã®é©çšæ§ã«ã€ããŠæ±ºå®ããŸãã