ã«ã¹ã¿ã ã¹ããŒã³ãããåé¢ãããã©ãããã©ãŒã ãã£ãã«ã¡ãœãããåŒã³åºãããšãããšãã¢ããªãã²ã©ãã¯ã©ãã·ã¥ããŸãïŒiOSãšAndroidã®äž¡æ¹ã§ïŒã ç§ã¯ãããäºæ³ããããã©ãããç解ããããšããŠããŸãã
ããã§ãªãå Žåã¯ãããããã©ããã§èšåãã䟡å€ããããŸãã
ãšã«ãããããã¯æœåšçã«åŒ·ãå¶éã«ãªãå¯èœæ§ããããšæããŸãã äºæ¬¡åé¢ãããã©ãããã©ãŒã ãã©ã°ã€ã³ãåŒã³åºãããšãã§ããæ¹æ³ã¯ãããŸããïŒ
cc @ mravn-ããªã¢ãŒãžã®ã°ãŒã°ã«
äºæ¬¡åé¢ãããã©ãããã©ãŒã ã¡ãã»ãŒãžãéä¿¡ããããšãããšããšã³ãžã³ã³ãŒãã¯nullãéåç §ããã¯ã©ãã·ã¥ããŸãã ç§ã¯ãŸã æ£ç¢ºã«ã©ããç¹å®ããŠããŸããã ç§ã¯å¢ç³ãæã«å ¥ããŸãããããã®ãããªãã®ã解éããæ¹æ³ãåŠã¶å¿ èŠããããŸãã
ïŒäžåšçšãªïŒåé¿çãšããŠãã»ã«ã³ããªåé¢ã¯ãã©ã€ããªåé¢ã«ã¡ãã»ãŒãžã®éä¿¡ãèŠæ±ããå¯èœæ§ããããŸãã
@sroddyäºæ¬¡åé¢æ ªã§äœãéæããããšããŠããã®ãèããŠãããã§ããïŒ
ããŸããŸãªãŠãŒã¹ã±ãŒã¹ããããŸããäŸïŒ
äžè¬ã«ãäŸåé¢ä¿ã䜿çšããŠãæçµçã«ãã©ãããã©ãŒã åºæã®ã³ãŒãã䜿çšããŠãããã®åŠçãå®è¡ãããã©ãããå®éã«ã¯ããããªãããã€ãã®ãããªãã¯ã¡ãœããã宣èšããããšããããŸãïŒããšãã°ããã©ãã¿ãŒãã¡ã€ã¢ã«ã€ããŠèããŠããŸãïŒã ãããã䜿çšããimhoã¯ãç³ã§æžããããã®ã§ã¯ãªããæéãšãšãã«å€åããå¯èœæ§ã®ããå®è£ ã®è©³çŽ°ã§ããå¿ èŠããããŸãã
ããŒã¿ã¯ã¡ãœãããã£ãã«ã«æž¡ãããæ¹æ³ã§ãã§ã«ãšã³ã³ãŒããããŠãããããåé¿çã¯ä»ã®ãšããåé¡ãªããå®è£ ããã®ã¯æ¯èŒçç°¡åã§ãããã®ãããåé¢ããŒããä»ããŠãç°¡åã«æž¡ãããŸãããããã©ãŒãã³ã¹ã¯æé©ã§ã¯ãªããšæããŸãã ã
ãã ããå®è£ äžã«å°ãè¡ãè©°ãŸããŸãããã¡ã€ã³ã®åé¢ã¡ãœãããã»ã«ã³ããªã®åé¢ã¡ãœããããéçã¡ãœãããåŒã³åºãç°¡åãªæ¹æ³ã®äŸãæããŠãã ããã
ããããšã
@sroddyèæ¯æ å ±ãæäŸããŠããã ãããããšãããããŸãã
ã¡ã€ã³ã¢ã€ãœã¬ãŒãã§ã®éçã¡ãœããã®åŒã³åºãã«ã€ããŠïŒçŽæ¥ãµããŒããããŠããªããããããŒãã䜿çšããŠå®è£ ããå¿ èŠããããŸãã ãã®ããã±ãŒãžã¯ããã®æ©èœãæäŸããå ŽåããããŸãïŒäŸïŒããïŒã ã§ãèªåã§è©Šããããšã¯ãããŸããã
ãã ããããã§ã¯ããã©ã°ã€ã³ãŸãã¯ä»ã®ã©ã€ãã©ãªã®å®è£ ã®äžéšãšããŠãã©ãããã©ãŒã ãã£ãã«éä¿¡ãè¡ãããå Žåã«ãæ©èœãããããäžè¬çãªãœãªã¥ãŒã·ã§ã³ãæ¢ãå¿ èŠããããŸãã
ããã«ã¯ãŸã ããã¯ããããŸããããã¡ã€ã³ã®åé¢ã§ã¯ãªããã»ã«ã³ããªåé¢ãã䜿çšãããæ¢ç¥ã®ãã£ãã«åã®ã»ããããããšå°ãã®éæ³å®ã§ããå Žåã¯ãäžè¬çã«äœ¿çšã§ããã¯ãã§ãããããã®ãã£ãã«ã«å¯ŸããŠèªåèªèº«ãåŠçãããã©ãããã©ãŒã ã¡ãã»ãŒãžãåæ§æãããã€ããªã¡ãã»ãŒãžã®å¿ èŠãªè»¢éãš2ã€ã®åé¢éã®å¿çãééçã«å®è£ ããŸãã ãã©ã°ã€ã³ã¯éããç¥ãããšã¯ãããŸããã
以äžã«ã¹ã±ãããããœãªã¥ãŒã·ã§ã³ã
ã¡ã€ã³ã¢ã€ãœã¬ãŒãã«ããŒãM1ãšR1ãèšå®ããã»ã«ã³ããªã¢ã€ãœã¬ãŒãã«M2ãR2ãèšå®ãããšããŸãã ã¡ãã»ãŒãžã®å Žåã¯Mãè¿ä¿¡ã®å Žåã¯Rã
BinaryMessages.setMockMessageHandler
ã䜿çšããŠããã©ãããã©ãŒã ã®ã¡ãã»ãŒãžãM1ã«è»¢éããŸãïŒãã®ãã£ãã«ã§BinaryMessage.sendã䜿çšãããã©ã°ã€ã³ã«ééçã«ïŒã å¿çã³ãŒã«ããã¯ãä¿åããã¡ãã»ãŒãžã®å¿çã®åä¿¡æã«æ£ãããã®ãåŒã³åºããã³ãã©ãŒã䜿çšããŠR2ãæ§æããŸãã BinaryMessages.handlePlatformMessage
ã«è»¢éãããã³ãã©ãŒã䜿çšããŠM2ãæ§æããŸãã ããã«å¿çã³ãŒã«ããã¯ãå®è£
ããŠãå¿çãR1ã«è»¢éããŸããBinaryMessages.send
ã«è»¢éãããã³ãã©ãŒã䜿çšããŠM1ãæ§æããŸãã ãã©ãããã©ãŒã ããR2ã«å¿çã転éããå¿çã³ãŒã«ããã¯ãèšå®ããŸãã ãŸãããã£ãã«ããšã«BinaryMessages.setMessageHandler
ãåŒã³åºããŠãM2ã«è»¢éãããã©ãããã©ãŒã ããã®çä¿¡ã¡ãã»ãŒãžã®ãã³ãã©ãŒãèšå®ããŸãã å¿çã³ãŒã«ããã¯ãä¿åããã»ã«ã³ããªåé¢ããã®å¿çã®åä¿¡æã«æ£ãããã®ãåŒã³åºããã³ãã©ãŒã䜿çšããŠR1ãæ§æããŸãã@Hixie次ã®ãã€ã«ã¹ããŒã³ã«ç§»åããããšããå§ãããŸãã åé¿çãååšããããã§ãã åªãããœãªã¥ãŒã·ã§ã³ã«ã¯ãAPIã®èšèšäœæ¥ãšå埩ãå¿ èŠã«ãªããŸãã
åãåé¡ãçºçããŸããããã®åé¡ã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
@ mravn-googleããã«ã€ããŠäœãæŽæ°ã¯ãããŸããïŒ ç§ã¯åãåé¡ã«ééããŸããïŒããšãã°ããã©ãããã©ãŒã åŽã§RSA 2048ããŒãã¢ãçæããå¿ èŠããããŸããããã¯ãå€ãããã€ã¹ãããŒã¿ã®æå·å/埩å·åã«æéãããããŸãïŒã AndroidãšiOSã®äž¡æ¹ã®ãã©ãããã©ãŒã ã«å®è£ ãããããããã©ãããã©ãŒã åŽã§ã®äœæ¥ã2åã«ãªããããã¹ã¬ããããµãŒãã¹ã®äœæã¯é¿ããããšæããŸãã ãããã®ãã©ãããã©ãŒã åºæã®æäœãDartããéåæã§å®è¡ããç°¡åãªæ¹æ³ã¯ãããŸããïŒ åé¿çã¯åé¡ãªãããã§ãããFlutterãšDartãåããŠäœ¿çšãããããå®è£ ã«åé¡ãããããã§ãïŒIsolateãªã©ã®ã¡ãã»ãŒãžã転éãããã³ãã©ãŒãæ§æããæ¹æ³ãããããŸããïŒãç³ãèš³ãããŸããããã®ããšã«ã€ããŠã
åãåé¡ãçºçããŸããã
Android / iOSåŽã§PDFãçæããå¿ èŠããããŸãããããããåŒã³åºããå®è¡ãããšãcomputeïŒ...ïŒã¡ãœãããã¢ããªãã¯ã©ãã·ã¥ãããŸãã
ç§ã¯ãã®åé¡ãæ±ããŠããŸãããããŠä»ç§ã¯ç«ã¡åŸçããŠããŸãã
ã¢ããªããã©ã¢ã°ã©ãŠã³ãã«ãªãå Žåã§ããå ±æèšå®ããããã¯ã°ã©ãŠã³ãåé¢ã§accessTokenãèªã¿åãããïŒã¡ã€ã³åé¢ãå®è¡ãããŠããªãå¯èœæ§ããããããããããããŸããïŒã
ã ããã誰ããããã¯ã°ã©ãŠã³ãåé¢ããæ°žç¶åãããããŒã¿ãèªã¿åãããã®è§£æ±ºçãæããŠããããŸããïŒ
ç§ã¯ä»æ¬åœã«å°ã£ãŠããŸãã
/ cc @ bkonyiããã¯ããªããåãçµãã§ããããšã«é¢é£ããŠããããã§ãã
åãåé¡ãçºçããŸããã CPUããŠã³ãã«åºã¥ãåœç€Ÿã®è£œåããŒã¹ã åé¢ã§ã¯ãã©ãããã©ãŒã æ¹åŒã䜿çšããå¿ èŠããããŸãã ãã®åé¡ã解決ããå¥ã®æ¹æ³ãæããŠãã ããã
@ Thomson-Tsuiåæ§ã®åé¡ãããã@ bkonyiãšåœŒã®FlutterGeofencingãµã³ãã«ã«ããäœæ¥ã®èžçã«åºã¥ããŠãflutter_blueãä»ã®ãã©ã°ã€ã³ã§äœ¿çšããŠããåé¢ã§äœããåäœãããããšãã§ããŸããã ããªããã¹ããããŠããŸããããè©ŠããŠã¿ãŠãã ããã
ç§ã¯åãåé¡ãæ±ããŠããŸããããã¯éèŠã ãšæããŸã
誰ãããã®åé¡ã解決ããŸãããïŒ
https://pub.dartlang.org/packages/flutter_isolateã䜿çšããŠããŸã
ããã¯ã°ã©ãŠã³ãã§ããŸããŸãªééã§ãªãŒãã£ãªãåçããå¿ èŠããããŸãã ãããè¡ãæãç°¡åãªæ¹æ³ã¯ããªãŒãã£ãªã管çããå¥ã®Isolateã䜿çšããããšã§ããããã®æ©èœããªããšãããŒãã䜿çšããéåžžã«å¥åŠãªåé¿çãå¿ èŠã«ãªããŸãã
dartããåé¢ãå®è¡ãããšããã€ãã£ãã©ã€ãã©ãªããªã³ã¯ããªããšæ³å®ããŠããŸãã
ããšãã°ãJavaãããã©ãã¿ãŒã³ãŒããå®è¡ããå Žåããã®ã¡ãœããã¯æ¬¡ã®ããã«åŒã³åºãããŸãã
  private native void nativeRunBundleAndSnapshotFromLibrary (
      long nativePlatformViewId,
      <strong i="7">@NonNull</strong> String [] prioritizedBundlePaths,
      <strong i="8">@Nullable</strong> String entrypointFunctionName,
      <strong i="9">@Nullable</strong> String pathToEntrypointFunction,
      <strong i="10">@NonNull</strong> AssetManager manager
  );
ãã¹ãŠã®éæ³ãèµ·ããïŒ
ããã¯ãè€æ°ã®FlutterNativeViewãäœæããå Žåãããã³åå®è¡ã§æ¬¡ã®ããšã確èªã§ããŸãã
 public void runFromBundle (FlutterRunArguments args)
次ã«ãããã€ãã®ãããŒãåé¢æ ªããååŸããŸã
ãã®åé¡ã«ãçŽé¢ããŠããŸãã ãã¹ãŠãã©ãããã©ãŒã ãã£ãã«ã«äŸåããããã¯ã°ã©ãŠã³ãåé¢ïŒå Žæããã€ãºãªã©ïŒããããŒã¿ãåéããå¿ èŠããããŸãã @ mravn-google-ããã«å¯ŸåŠã§ããAPIã®æŽæ°ã«é¢ãããã¥ãŒã¹ã¯ãããŸããïŒ
ããã¯ãããŒã«ãã¡ãã£ã¢ã¢ããªã§ã¯æ¬åœã«æ·±å»ãªåé¡ã§ãã
ãã©ãããã©ãŒã ã¹ã¬ããã¯ç°¡åãªæ¹æ³ã§ã¯ãããŸããã
ç§ãåæ§ã®åé¡ã«çŽé¢ããä»ç«ã¡åŸçããŠããŸãã
+1ïŒç§ã®ãããžã§ã¯ããåé¢ããããã©ãããã©ãŒã ãã£ãã«ãã²ã©ãå¿ èŠãšããŸãïŒ
ç»åãããã¯ã°ã©ãŠã³ãã§ã¬ã³ããªã³ã°ããå¿ èŠããããŸãã åã€ã¡ãŒãžã¯æ°ç§ããããã¡ã€ã³ã¹ã¬ããã§å®è¡ãããšUIããããã¯ããããããåé¢ããŠå®è¡ããå¿ èŠããããŸãã ç§ã¯dartïŒui.PictureRecorderã®æåã®ãã€ãã£ãåŒã³åºãã§ç«ã¡åŸçããŠãããïŒãã€ãã£ãé¢æ°ã䜿çšããïŒãã¹ãŠã®ã°ã©ãã£ã«ã«åŒã³åºããæ©èœããªããšæ³å®ããŠããŸãã ãã£ã³ãã¹ã§å€ãã®é¢æ°ã䜿çšããŠããã®ã§ãã³ãŒã«ããã¯ããŒããæäœããã®ã¯é¢åã§ãã
解決çã¯é«ãè©äŸ¡ãããŠããŸãã
+1ãã®åé¡ãçºçããŸãã
@ mravn-googleããªãŒãã¹ã®Googleã§æ©èœããªããªã£ãããã§ãã ããã調æ»ããŠããGoogleFlutterããŒã ã®ä»ã®èª°ããããã®ã ãããã IMOãããã¯ã匟åæ§ãããå ç¢ãªFlutterã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«Flutterãæ¬æ Œçã«äœ¿çšããããã®äž»èŠãªã·ã§ãŒã¹ããããŒã§ãã
ãã¶ã@sethladdã¯ã¹ããŒã¿ã¹ãäžããããšãã§ããŸããïŒ
+1
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ
+1
èªåã§è§£æ±ºããæ¹æ³ãç¥ã£ãŠããããåŸ ã€ã ãã®ãã°ã«ééããæ¥ã¯ãç§ããã©ãã¿ãŒãšã³ãžãã¢ã«ãªããŸã§ã®æåŸã®åžæã§ãã
æ°ãããã©ãã¿ãŒ/ããŒããŠãŒã¶ãŒã®ããã®åé¿çã®ãã詳现ãªèª¬æãå¿
èŠã§ãã ç§ã¯2æ¥åã«åé¢æ ªã䜿ãå§ããå
é±ã¯ãã©ãã¿ãŒ/ããŒãã䜿ãå§ããŸãããæ·±å»ãªåŽåãèŠããã¿ã¹ã¯ã«ã¡ã€ã³ã¹ã¬ããã䜿çšããå¿
èŠãããããã§ãããã®ããããã©ãã¿ãŒã®åŠç¿ã¯æªã解決çã«ãªããŸãã 䜿çšå¯èœãªãã«ãã¹ã¬ããããªããã°ãKotlinãåŠã³ãã¢ããªã2åãã«ãããã»ããããã§ãããã åå¿è
ã«ãšã£ãŠãããããããã®ããã¹ãŠéããããããšãé¡ã£ãŠããŸããä»äºã§ããã䜿çšã§ããããã«ãéçšäž»ã«ãã©ãã¿ãŒãåŠã¶ããšãæ£åœåã§ããããã«ããããšæã£ãŠããŸãã
ããã«ãªãå Žåã¯ãããããStackOverflowã§ãããã«è³ªåãæçš¿ããŸããïŒ https ïŒ//stackoverflow.com/q/57466952/6047611
+1ãããããã«ä¿®æ£ãããããšãé¡ã£ãŠããŸã
+1ç§ã®ãããžã§ã¯ãã«ã¯åé¢ãããã©ãããã©ãŒã ãã£ãã«ãå¿ èŠã§ãã
ç§ã¯ãããšåãåé¡ã«ééãã@ mravn-googleã«ãã£ãŠæçš¿ããããã®ãšåæ§ã®åé¿çã䜿çšããŠããã±ãŒãžïŒ Isolate Handler ïŒãäœæããŸããã ãã ããIsolate Handlerã䜿çšãããšãã¡ã€ã³ã®åé¢ããä»ã®åé¢ãšäžç·ã«ãã£ãã«ã䜿çšã§ããŸãã åé¢å
ããã®çŽæ¥MethodChannel
åŒã³åºãããµããŒãããŸãããçŸåšEventChannel
ã¹ããªãŒã ã¯ãµããŒããããŠããŸããã 人ã
ãå¿
èŠãšããŠããããšãå€æããå Žåã¯ããµããŒããè¿œå ããããšãæ€èšããŸãã
åé¿çã®1ã€ã®æ¬ ç¹ã¯ãåé¢ãã³ãã©ãŒã«ãã£ãã«åãæå®ããå¿ èŠãããããšã§ãã èªåã§ãã€ãã£ãã³ãŒããæžããŠããã®ã§ããããžã§ã¯ãã§ã¯åé¡ãããŸãããããã以å€ã®å Žåã¯ã䜿çšããŠãããã©ââã°ã€ã³ã®ãœãŒã¹ã³ãŒãã調ã¹ãŠèŠã€ããå¿ èŠããããŸãã
äžèšã§ãã§ã«æçš¿ãããŠãããã1ã€ã®ãªãã·ã§ã³ã¯ã FlutterIsolateã§ããããã¯ãå¥ã®ã¢ãããŒãã䜿çšããŠãããæ€èšãã䟡å€ããããŸãã
ããŸãããã°ãFlutteréçºè ã¯ãã®åé¡ã«å¯Ÿããå®å šã§é©åãªè§£æ±ºçãããã«æäŸããã§ãããã
ç·šéïŒ
Flutterã®ãã¡ãŒã¹ãããŒãã£ã®AndroidAlarm Managerãã©ã°ã€ã³ãšåæ§ã®ã¢ãããŒãã䜿çšãã代ããã«ããã€ãã£ãåŽããåé¢ãéå§ããããšã§ãæçµçã«åé¡ãããã¯ãªãŒã³ã«è§£æ±ºããŸããã
ç§ãããªããã°ãªããªãã£ãã®ã¯ããã€ãã£ãã³ãŒãããã©ã°ã€ã³ã«å€æããŠããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã«ç»é²ã§ããããã«ããããšã ãã§ãããããã¯ãæ¯èŒçç°¡åãªç§»è¡ã§ããã pub.devã®ãã©ã°ã€ã³ã䜿çšãããšãã·ãŒã ã¬ã¹ã«æ©èœãããããããã«ç°¡åã«ãªããŸãã
ããã§æŽæ°ã+1ããŸããïŒ
+1
ç§ãããã§æ°ã¥ããŠããèå³æ·±ãããšïŒ
ããã€ãã®ãã©ã°ã€ã³ã¯ãã¡ãœãããã£ãã«åŒã³åºããDartããããã¯ã°ã©ãŠã³ãã¹ã¬ããã«ã¡ãã»ãŒãžãæž¡ãããšãåæãšããŠäœæãããŠããããã§ãã ããã«é¢é£ããŠããã®bgãžãªãã§ã³ã¹ã®äŸã«åŸããã¡ã€ã³ã¹ã¬ããã«æ»ãæ¹æ³ãèããŠããéåžžã«æ··ä¹±ãã人ã
ãããŸã...
ãã®ãã©ã°ã€ã³ã³ãŒãã¯ãçãã¿ã¹ã¯ãå®è¡ããŠããå Žåã¯ããžã£ã³ã¯ããåŒãèµ·ãããŸããããããã©ã«ãã§ã¯ãAndroidã§ã¯ãUIã¹ã¬ããããšåŒã°ããŠãããã©ãããã©ãŒã ã¹ã¬ããã§å®è¡ãããŸãã ããã«ãããã¯ãŒã¯ããŒããé«ããšãã«ãžã§ã¹ãã£ãå®å
šã«ãããããããå¯èœæ§ããããä»ã®ãã¹ãŠã®ã¡ãã»ãŒãžãã£ãã«ããããã¯ãããããšãç解ããŠããŸãã
ãã®åŸããã©ã°ã€ã³ã®äœæè
ã®ãšã³ãžãã¢ãªã³ã°ã«ç¿»åŒãããŸãã 圌ããéãäœæ¥ããã€ãã£ãã³ãŒãã®å¥ã®ã¹ã¬ããã«ç§»åããå Žåã«ã®ã¿ãã¡ãœãããã£ãã«ã§åŸ
æ©ããã³ãŒããå®è¡ããŸãã ãããã®ã¡ãã»ãŒãžãã£ãã«ã¯ããã©ãããã©ãŒã ã¹ã¬ããã§å®è¡ããå¿
èŠããããŸãã
ç§ã¯è¯ããã³ã¡ã€ã¬ã«ããããã«é¢ä¿ããŠããçè«çæ ¹æ ãç解ããŠããŸãããããã«åæããŸãïŒ
çµæãšããŠåŸãããã¢ãŒããã¯ãã£ã¯ããã©ã°ã€ã³äœæè
ã®ããã©ã«ããšããŠéèŠãªã¢ã³ããã¿ãŒã³ãéãããšæããŸãã äžèŠãããšãfirebasemlãã©ã°ã€ã³ã§ãããã®åŠçã«ãã©ãããã©ãŒã ã¹ã¬ããã䜿çšããŠãããšæããŸãã
ã§ããããéãç©ãæã¡äžãã人ã
ã«äœããã®åŒ·ãèŠåãäžãããããããã®ã«ãšæããŸãã ãããããããã©ã«ãã®ãµã³ãã«ã¢ããªã§ã¯ãã¡ãã»ãŒãžãã£ãã«ã®åŒã³åºããè¿ããããŸã§ã«çŽ20ããªç§ä»¥äžãããå Žåã«ç»é¢äžã®ãšã©ãŒãçºçããŸããããããããã£ãšå€ãã®äººã®é¡ã«ãªããŸãã æ£çŽãªãšãããdbåŒã³åºããè¡ã人ã
ãçŽåŸããããã®ã¯äœã§ãïŒcã ãã§ã«ã¹ã¬ãããååŸããããã«è¡ããŸãã
倧äºãããªãŒã©ã³ãã¯ãããŸãããããã¯ç¢ºãã§ã...
æçµçã«ãJavaãšSwiftã䜿çšããŠãã€ãã£ããã©ãããã©ãŒã ã¹ã¬ããã§éãã¯ãŒã¯ããŒããå®è£ ããããšã«ãªããŸããã åé¿çã¯èŠã€ãããŸããã§ããã
@AndruByrneããã¯ç¢ºãã«éåžžã«èå³æ·±ãæ å ±ã§ãããç§ã¯ãããç¥ããŸããã§ããã ãã©ã°ã€ã³ã«é¢é£ããåé¡ããã§ã«1ã€ãããŸãããŠãŒã¶ãŒããã©ã°ã€ã³ãããã¯ã°ã©ãŠã³ãã§éãäœæ¥ãå®è¡ããæ¹æ³ãšããŠäœ¿çšããããšããŠããŠãUIãããã¯ãããŠããŸããã
èŠåãããã¯ãã§ããããšã«åæãããã©ã°ã€ã³ã«èŠåãè¿œå ããŸãã
+1ãããå¿ èŠ
æ®å¿µãªãããFlutterã¯ãéåžžã«åºæ¬çã§ãããªããéåžžã«éèŠãªãã®ãäžè¶³ããŠããããããã©ã€ã ã¿ã€ã ã®æºåãã§ããŠããŸããã ãã¹ãŠã®Flutterã¢ããªãåçŽãªéåæ/åŸ æ©ã§è§£æ±ºã§ããããã§ã¯ãããŸããã éåŽåã®å ŽåãIsolateã¯äžå¯æ¬ ã§ãããå¥ã®Isolateããã®ãã©ãããã©ãŒã ãã£ãã«ã¡ãœããåŒã³åºããèš±å¯ã§ããªããã©ã°ã€ã³ã¯ãããããç¡æå³ã§åé·ã«ããŸãã Xamarinã§ã¯ãããã1æ¥ç®ãããã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããŠããŸããã確ãã«ãããã¯ä»ãã解決çã«è³æ祚ãæããå¿ èŠããããŸãã
+1ãããå¿ èŠ
+1
å¥ã®åé¢ããããã©ãããã©ãŒã ãã£ãã«ã¡ãœãããåŒã³åºãå¿ èŠããããŸãïŒ
+1
+1
+1
+1ããã¯æã£ãŠããå¿ èŠããããŸã
+1
åŒã³åºãå¿
èŠã®ãããã€ãã£ãSDKããããŸãã BackgroundFlutterMethodChannel
ã®ãããªãã®ããããšããã§ãããã
+1
+1
誰ãã_ã¯ã©ãã·ã¥ãã²ã©ã_å®éã«äœã説æããŠããã®ãã«ã€ããŠäœãæ å ±ãæã£ãŠããŸããïŒ ãã€ãã£ãã©ã€ãã©ãªãå®è£ ããæŠå¿µå®èšŒã«åãçµãã§ãããã¡ãœãããã£ãã«ãä»ããŠã¡ãã»ãŒãžãéåä¿¡ãããšãã«ããŠã©ããããã°ã¿ã€ã ã¢ãŠãïŒ0x8badf00dïŒããã®ä»ã®å¥åŠãªãšã©ãŒãçºçããŠããŸãã
ããã¯ãä»ã®ã¹ã¬ããããåŒã³åºãããããã€ãã®ã¡ãœãã[ããã³çµæ]ãåå ã§ãããšæãããŸãããæ£ç¢ºãªåé¡ãç¹å®ããããšã¯ã§ããŸããã§ããã
+1
+1
+1
+1
+1ãããå¿ èŠ
+1ããããå¿ èŠã§ãïŒ
ãã®åé¡ã¯å°ãªããšãP2ãšããŠåªå
ãããã¹ãã ãšæããŸãã
ç§ãèããããšãã§ãããã©ãããã©ãŒã ãã£ãã«ã®äœ¿çšã¯
ãããŠãããã¯äž»èŠãªãããã«ãŒã§ãã
flutter_downloaderãã©ã°ã€ã³ã¯ãããã¯ã°ã©ãŠã³ãã®åé¢ã³ãŒããåŠçããŸãã äžèŠã®äŸ¡å€ããããšæããŸãã
ç§ã¯ããã次ã®ããŒãžã§ã³ã§è§£æ±ºãããããšãæãã§ããŸãããããã°ã¯ãŸã 1.12ããŒãžã§ã³ã«æ®ã£ãŠããŸãïŒ
ã¯ã©ã€ã¢ã³ãåŽã®ã³ãŒãã¯ãã£ãã«ã®å察åŽã«å€ããããkotlinã§èšè¿°ãããŠãããã¢ããªã¯åäžã®httpæ¥ç¶ããšã«ã»ãšãã©ã¹ã¿ãã¯ããŸã
GooooooooooooooogleïŒ!!!!!!!!!!!!ïŒïŒïŒïŒïŒïŒïŒ
ãã®ãã©ã°ã€ã³ã¯åœ¹ç«ã€ãããããŸããflutter_isolate
+1ãããå¿ èŠã§ã...ãã
+1
ç§ã«ãšã£ãŠæ倧ã®åé¡ã¯ãDartãšãã€ãã£ããã©ãããã©ãŒã éã®éä¿¡ãã¡ã€ã³ã¹ã¬ããã§è¡ããããšããäºå®ã§ããUIãé ãããããããŒãžããŒã¿ã«é¢åãªã³ãŒããèšè¿°ãããããªãéãã倧éã®ããŒã¿ãéä¿¡ããããšã¯äžå¯èœã§ãã
+1ãããå¿ èŠ
ããŒãžããŒã¿ã«é¢åãªã³ãŒããæžãã
@lukaszciastkoããŒãžããŒã¿ã«ã³ãŒããæžããšã¯ã©ãããæå³ã§ããã 倧éã®ããŒã¿ãéä¿¡ãããšãã«é ããŠããUIã解決ããæ¹æ³ã¯ãããŸããïŒ
@YaredTaddese
ISOLATEã®æ©èœã®è€éããããã³UIãšISOLATEéã®çžäºéä¿¡ã«å¿ããŠãISOLATEãåŒã³åºãåã«ãISOLATEããã®ãžã§ããå®è¡ããããã«å¿ èŠãªããŒã¿ãæ§é åããããšã«ãããUIã³ãŒãã§ãã®åé¡ãåé¿ã§ããŸãã çŸåšã®Flutterã¢ããªã§è±å¯ãªPDFãçæããŠããŸãããŠãŒã¶ãŒã¯ãçæããè€æ°ã®PDFãéžæã§ããŸãã
ããããã1ã10,000ããŒãžãçæã§ããŸãã ç§ã®UIã¯å¿çæ§ãé«ããåãžã§ããå®äºãããšãã¬ããŒãã衚瀺ããTABãäœæãããŸã-ãžã§ããTOASTãä»ããŠå®äºããUIãåæ¢ããªãå ŽåããŠãŒã¶ãŒã¯éç¥ãåãåããŸã-ãŠãŒã¶ãŒã¯ãããã¯ã°ã©ãŠã³ãã§ããžãŒãªãµãŒãã¹ãããããšã«æ°ã¥ããŠããŸãããªããPDFãçæããŸãã
ç§ã®PDFçæã¯ISOLATEã§ããããšã«æ³šæããŠãã ããã ISOLATE-ã§ã¯ãCLOUD FIRESTOREããç»åãããŠã³ããŒãããŠPDFã«åã蟌ãå¿ èŠããããŸã-ããã¯ãã¹ãŠãã·ãŒã ã¬ã¹ã«è¡ãããŸãã
@MsXamã§ãããå¥ã®åé¢ãããã©ãããã©ãŒã åºæã®é¢æ°ãåŒã³åºãããšãã§ããŸãã...ããã«ãããã¡ã€ã³ã®åé¢ã§ãã©ãããã©ãŒã åºæã®é¢æ°ãåŒã³åºãããšãã§ããŸã...ããã«ããUIãé ããŸã
ç§ã¯åãåé¡ãæ±ããŠããŸããããã¯éåžžã«éèŠã ãšæããŸã
@YaredTaddese
ISOLATEã®æ©èœã®è€éããããã³UIãšISOLATEéã®çžäºéä¿¡ã«å¿ããŠãISOLATEãåŒã³åºãåã«ãISOLATEããã®ãžã§ããå®è¡ããããã«å¿ èŠãªããŒã¿ãæ§é åããããšã«ãããUIã³ãŒãã§ãã®åé¡ãåé¿ã§ããŸãã çŸåšã®Flutterã¢ããªã§è±å¯ãªPDFãçæããŠããŸãããŠãŒã¶ãŒã¯ãçæããè€æ°ã®PDFãéžæã§ããŸãã
ããããã1ã10,000ããŒãžãçæã§ããŸãã ç§ã®UIã¯å¿çæ§ãé«ããåãžã§ããå®äºãããšãã¬ããŒãã衚瀺ããTABãäœæãããŸã-ãžã§ããTOASTãä»ããŠå®äºããUIãåæ¢ããªãå ŽåããŠãŒã¶ãŒã¯éç¥ãåãåããŸã-ãŠãŒã¶ãŒã¯ãããã¯ã°ã©ãŠã³ãã§ããžãŒãªãµãŒãã¹ãããããšã«æ°ã¥ããŠããŸãããªããPDFãçæããŸãã
ç§ã®PDFçæã¯ISOLATEã§ããããšã«æ³šæããŠãã ããã ISOLATE-ã§ã¯ãCLOUD FIRESTOREããç»åãããŠã³ããŒãããŠPDFã«åã蟌ãå¿ èŠããããŸã-ããã¯ãã¹ãŠãã·ãŒã ã¬ã¹ã«è¡ãããŸãã
ãã©ãããã©ãŒã åºæã®ã³ãŒããåŒã³åºããŠããŸããïŒ
誰ããåé¢ãããã©ãããã©ãŒã ãã£ãã«ãåŒã³åºãããã®åé¿çãæã£ãŠããŸããïŒããã¯UIã¹ã¬ãããããããããšããèããæã¡è² ãããŸãã
ç§ã¯åãããšã«åºå·ããŠããŸãã
kotlinã³ãŒããšgetStream.ioAPIã䜿çšããŠmethodchannelãåŒã³åºããŠããŸãããããã¯å°çã®ããã«é ããFlutter UIãããªãŒãºããããã«ã³ã³ãã¥ãŒãã£ã³ã°ãè¿œå ãããã£ãã®ã§ãããåããšã©ãŒãçºçããŸããã
ã©ãããã°ãããä¿®æ£ã§ããŸããïŒ
ç§ãããã«åºããããŸããã ç§ã¯æ°ããã¢ããªã®ãããã¿ã€ããäœæããŠããŸãããå®éã«ã¯ãã®åé¡ã¯ç§ã«ãšã£ãŠç®ãèŠåŒµããã®ã§ãããFlutter以å€ã®ä»ã®ãœãªã¥ãŒã·ã§ã³ãæ€èšããããšã«ãªããæ²ãããªããŸãã
ãã®åé¡ãžã®åçã®éã瀺ãããã«ãããã¯äž»èŠãªåé¡ã§ãããFlutterã¢ããªã®ã³ã³ããã¹ãã§ã®åé¢ã®äž»ãªãŠãŒã¹ã±ãŒã¹ãã»ãŒæã¡è² ãããŸãã
ç§ãããã«åºããããŸããã ç§ã¯æ°ããã¢ããªã®ãããã¿ã€ããäœæããŠããŸãããå®éã«ã¯ãã®åé¡ã¯ç§ã«ãšã£ãŠç®ãèŠåŒµããã®ã§ãããFlutter以å€ã®ä»ã®ãœãªã¥ãŒã·ã§ã³ãæ€èšããããšã«ãªããæ²ãããªããŸãã
ãã®åé¡ãžã®åçã®éã瀺ãããã«ãããã¯äž»èŠãªåé¡ã§ãããFlutterã¢ããªã®ã³ã³ããã¹ãã§ã®åé¢ã®äž»ãªãŠãŒã¹ã±ãŒã¹ãã»ãŒæã¡è² ãããŸãã
ãããããã¯å€§ããªåé¡ã§ããã§ããã ãæ©ãä¿®æ£ããå¿ èŠããããŸã
ç§ã¯10æ¥éãã©ãã¿ãŒãåŠãã§ããŠãä»ã®ãšããããã倧奜ãã§ããããã°ããããŠå®éšãããšãåé¡ãçºçãå§ããæ¬ ç¹ãããããŸãããã®åé¡ã¯ã2018幎1æ5æ¥ããå ¬éãããŠããŸã...
ãã®ãã°ãä¿®æ£ããŠãã ããã
ããã«ãµããŒãããããšæããŸãã
@ jpsarda ã @ klaszlo8207æ¯ãæ¢ããªãã§ãã ããã ãããŠãã¯ããä»æ¥ãŸã§ãåé¡ã®è§£æ±ºçããããŸããïŒ httpsïŒ//pub.dev/packages/isolate_handlerã Flutterã®ããæè¿ã®å€æŽïŒãããæ°æ¥ïŒã«ããããã®ã«ãŒãããã©ãããšãã§ããªããªã£ããããããã°ã©ããŒã¯ä»æ¥ãã©ã°ãæããªããã°ãªããŸããã§ããã
ãã ããããã¯å®éã«ã¯äžŠååŠçãæå³ãããã®ã§ã¯ãªãããšãç¥ã£ãŠããå¿ èŠããããŸãã ãã®ããã«èŠããã¢ãã€ã«ã¢ããªã§ã¯èŠãç®ãéèŠã§ããããã©ãããã©ãŒã ã³ãŒãã¯ãšã«ããã¡ã€ã³ã¹ã¬ããã§å®è¡ããããããé·ãã¿ã¹ã¯ãåé¢ããã¡ã€ã³ã¹ã¬ããã«å§ä»»ããŠãå®éã«ã¯äœãéæãããŸããã§ããã
éåæé¢æ°ã䜿çšãããšãã¯ãã€ã§ããããã©ã«ãã§dartããã«ãã¹ã¬ãããåŠçããããã«ãããšäŸ¿å©ã§ãã
@spiderion Asyncã¯ãä»ã®å€ãã®ãã©ãããã©ãŒã ãšåæ§ã«ããã«ãã¹ã¬ããåãæå³ãããã®ã§ã¯ãããŸããã§ããã ç§ã誀解ããªãã§ãã ããããã©ãããã©ãŒã ãã£ãã«ã®å¶éã¯å€§ããªåé¡ã§ã¯ãªããšã¯èšããŸããïŒç§ã®ã¢ããªã¯æšæ¥ãŸã§èšåãããã©ã°ã€ã³ã§åäœããŠããã®ã§ãä»ã¯åé¿çãæ¢ãå¿ èŠããããŸãïŒããasync / awaitã¯ãæåã®æ¥ãããã«ãã¹ã¬ããåã«ã€ããŠã§ã¯ãããŸããã§ããã
@zoechiãã®åé¡ã«é¢ããæŽæ°ããããã©ããããŸãã¯ä¿®æ£ããèšç»ããããã©ãããç¥ãããã§ããïŒ
ããããšãã
@spiderion圌ãã¯ãããå®éã«ä¿®æ£ããããšã¯ã§ããŸãããããã¯åé¢ãæ©èœããæ¹æ³ããæ¥ãŠããŸãã èåŸã«UIãšã³ãžã³ããªãããããã©ãããã©ãŒã ãã£ãã«éä¿¡ã¯ãããŸããã ãã ãã圹ç«ã€2ã€ã®ãã©ã°ã€ã³ããããŸãã
https://pub.dev/packages/flutter_isolateã¯ãç¬èªã®UIãããã³ã°ãäœæããããããã©ã°ã€ã³ãšéä¿¡ã§ãã代æ¿ã®åé¢ãæäŸããŸãïŒæè¡çã«ã¯ã衚瀺ããããåŠçãããããããã®ã¯ãããŸããïŒã
https://pub.dev/packages/isolate_handlerã¯ãæè¿ã®Flutterã®å€æŽã«ãã以åã®äœ¿çšæ¹æ³ãäžå¯èœã«ãªã£ããããäžèšã®ããã±ãŒãžã«äŸåããããã«å€æŽããŸããã flutter_isolate
èªäœã§ã¯ãªãããã®ããã±ãŒãžã䜿çšããå©ç¹ã¯ãåŠçæ©èœãè¿œå ãããããšã§ããè€æ°ã®åé¢ãéå§ãããããã远跡ã§ããåé¢ãšã¡ã€ã³ã®éã«ç¬èªã®éä¿¡ãèšå®ããå¿
èŠããããŸãããã¹ã¬ããïŒå
ã®åšåº«Isolate
ãšFlutterIsolate
ã®äž¡æ¹ã§æåã§è¡ãå¿
èŠãããããšïŒã¯ãæœè±¡åãããŠããã«å©çšã§ããããã§ãã
ç§ã¯å®ç§ãªæåãåããŠ2çªç®ã䜿çšããŸãã å®éãç§ã¯ããªãé·ãéããã䜿çšããŠããŠãFlutterãå£ãå€æŽãæ¥ããšããç§ã®ã¢ããªãå£ãããšããçç±ã ãã§ãããã°ã©ããŒãæ°ãããœãªã¥ãŒã·ã§ã³ã«ç§»è¡ããã®ãæäŒããŸããã :-)
ãããã£ãŠãã³ã¢ããã®ãœãªã¥ãŒã·ã§ã³ãæåŸ ããã®ã¯åççã§ã¯ãªããšæããŸããç¹ã«ãã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãã©ãããã©ãŒã ãã£ãã«éä¿¡ãå¿ èŠãªãããããããã³ã°UIãšã³ãžã³ã¯ãã¹ãŠã®åé¢ã«è¿œå ããããã®ã§ã¯ãããŸããã è¿œå ã®æ©èœãå¿ èŠãªå Žåã¯ãæ¢åã®ãã©ã°ã€ã³ã䜿çšããŠãã ããã
ããã«ã¡ã¯@deakjahnã¯ããªãã®è¿ éãªçããããããšãã
ããªããæäŸãããœãªã¥ãŒã·ã§ã³ã¯éåžžã«åœ¹ç«ã€ããã«èŠããŸãã ãããããããç§ã®åé¡ã解決ã§ãããã©ããã¯ããããŸããã ç§ã¯çŸåšããŠãŒã¶ãŒãInstagramã«äŒŒãã¹ããŒãªãŒãäœæãããšããç¶æ³ã«ãããŸãã ãã®å Žåãã¢ããªã¯Firebaseã¹ãã¬ãŒãžã«åç»ãšãã¡ã€ã«ã®ãªã¹ããã¢ããããŒãããå¿ èŠããããŸããã¢ããããŒãã«ã¯éåžžã«é·ãæéããããå¯èœæ§ãããïŒæ¥ç¶ãé ãå Žåã¯çŽ15åïŒããã¡ã€ã«ãã¢ããããŒããããåŸãã¢ããªã¯äœæããå¿ èŠããããŸãFirebaseã¯ã©ãŠãäžã®ããã¥ã¡ã³ãã§ããFirestoreã ç§ãééããåé¡ã¯ããã¡ã€ã«ã®ã¢ããããŒãäžã«ãŠãŒã¶ãŒãã¢ããªã匷å¶çµäºãããšãã¿ã¹ã¯å šäœãå®å šã«å®è¡ãããªãããšã§ãã
ããã¯å®éã«ã¯åé¢è ã®è²¬ä»»ã§ã¯ãããŸãããããã¯ããªãããããããããã«èšãããšãããã ãã§ãã Firebaseã¯ãèªåã§äœ¿çšããããšã¯ãããŸããããç§ãèŠãéããåæ¢ããã¢ã³ããŒããåéã§ããŸãã
getBatteryLevelã®äŸãå®è¡ããããšããŠããŸãã
https://flutter.dev/docs/development/platform-integration/platform-channels?tab=android-channel-java-tab
Androidããã€ã¹ã§å®è¡ããããšãããšã¯ã©ãã·ã¥ããŸãã 誰ãå©ããŠããããŸããïŒ ãã°ããªããç¡éã«ãŒãã§å®è¡ããç¶ãããŸã£ããåãã³ãŒãã䜿çšããŠããããããšã©ãŒã確èªããæ¹æ³ããããããŸããã
ãã®åé¡ã«P5ã®ã©ãã«ãä»ãã??? ð¥µ
以åã®ã³ã¡ã³ãããã§ãã¯ããŠãã ããã ã»ãšãã©ã®åé¢æ ªãå¿ èŠãšããªãã¡ã«ããºã ãå¿ èŠã§ãããããããããã¬ãŒã ã¯ãŒã¯ã§å€æŽãããå¯èœæ§ã¯éåžžã«äœããšæãããŸãããããã£ãŠããã®ãªãŒããŒããããè¿œå ããŠãæå³ããããŸããã ããªãããããå¿ èŠãšããå Žåã®ããã«ãããã解決ããããã®ããã±ãŒãžããããŸãã
ãŠãŒã¶ãŒã¯ã¡ã«ããºã ãæ°ã«ããŸããã ãããã©ãã»ã©é£ãããã©ããã 圌ãã¯ãã çµæãå¿ èŠãšããŠããŸãã ããã¯äžå¯èœãããããŸããã ãããããŠãŒã¶ãŒããããå¿ èŠãšããå ŽåãFlutterã¯ãããæäŸããå¿ èŠããããŸã...
å®è£ ã«ã¯å¶éãããããã®æ©èœãæ¢åã®åé¢ã«è¿œå ãããããã®æ©èœã䜿çšããŠæ°ããAPIãäœæãããããã«ã¯ãããªãã®æéããããå¯èœæ§ãããããšãç解ããŠããŸãã ããã¯P5ãããåªå 床ãé«ãã¯ãã ãšæããŸãã
ãŸããç§ã¯ããªãã®ã³ã¡ã³ãããã¹ãŠèªã¿ãŸããããããŠããªããããªããäœæããããã±ãŒãžã宣äŒããŠããããã«ç§ã«ã¯æããŸãã
ãããããããäœæããã®ã¯ç§ã§ã¯ãããŸããã§ããããæ°é±éåã«ãã®æææš©ãåãå ¥ããŸããã ãã®ã¹ã¬ããã§ã¯ãããç§å¯ã«ãããŠãããšã¯æããŸããã ããã«å ããŠãç§ã¯ããªããæ¢ããŠãããã®ãæäŸããããšãã§ãã2ã€ã®ããã±ãŒãžïŒ1ã€ã®æçš¿ã§ãå®éã«ã¯1åã ãïŒã«ã€ããŠèšåããŸããã
ããªãããããèªãã å Žåãç§ãæåã«ãããã䜿çšããå¯äžã®çç±ã¯ãããªããæ±ããŠãããã®ãšãŸã£ããåãæ©èœãå¿ èŠã ã£ããšããããšã§ããã ãããŠãç§ã®ã¢ããªã¯1幎以äžãåé¡ãªãããã«äŸåããŠããŸãã ãã®äžãåé¢æ ªã®å éšåäœã«æ £ããããšã¯ãããŸã«ãããã䜿çšããéçºè ãããïŒããã«ãFlutter Webã§ãããã®å¯Ÿå¿ç©ã«åãçµã¿å§ããïŒãç§ãæžããããšãçå®ã§ãããšç§ã«æãããŸãïŒãã®æ©èœã¯ããã§ã¯ãããŸãããã¬ãŒã ã¯ãŒã¯ã«çµã¿èŸŒãŸããŠããã®ã¯ããã¬ãŒã ã¯ãŒã¯ãå«ããããšã«å察ããè°è«ãããªãããããã§ãã æéããããããã§ã¯ãªãããŸã£ãããããŸããã æ¯èŒççãæéã§æžã¿ãŸãã ããããã¹ãŠã®åé¢ã«ããã¯ãšã³ãã®è€éããè¿œå ãããšããçç±ã ãã§ããããã®ã»ãã®äžéšã ããå®éã«å¿ èŠãšãã䜿çšããã§ãããã
@deakjahnãããã®ãã³ãã«æè¬ããŸããisolate_handlerã䜿çšãããšããã€ãã£ãåŽã§éç¥ãåãåããã³ã«ãã¡ãœãããåŒã³åºããŠããŒã¿ãããŒãåŽã«éä¿¡ããã®ã«åœ¹ç«ã¡ãŸããïŒ ïŒç§ã¯twilioãã€ãã£ãSDKã䜿çšããŠããããã€ãã£ãåŽã§ããã·ã¥éç¥ãåä¿¡ããŠââããŸãïŒ
ãããããã©ãããã©ãŒã ãã£ãã«ãä»ããéä¿¡ã«äœ¿çšããpatformãã©ã°ã€ã³ãããããšãæå³ããå Žåã¯ãã¯ãã2ã€ã®ããã±ãŒãžã®ããããã圹ç«ã¡ãŸãã éåžžã®ã³ãŒãã§åäœããå Žåããããã®ããã±ãŒãžã«ãããåé¢ãããã³ãŒãã§ãåäœããããã«ãªããŸãã
@deakjahnè¿ éãªå¯Ÿå¿ããããšãããããŸãïŒ ç§ã®åé¡ã¯ãéåžžã®ãã©ãããã©ãŒã ãã£ãã«ã§ã¯ãããã§ããªãã£ãããšã§ããããããããŸããããtwilio SDKã¯ãã¡ã€ã³ã¹ã¬ããã§ã¯ãªããå¥ã®åé¢ã§ããã·ã¥éç¥ã®ãªãã¹ã³ãåŠçãããšæããŸãããããç§ã®åé¡ã ãšæããŸãã 2ã€ã®ããã±ãŒãžã®ããããã䜿çšããŠéç¥ãåãåããã³ã«ã¡ãœãããåŒã³åºããå Žåã«æ©èœãããã©ãããç¥ããããšæããŸãããã©ããããããšãããããŸããã ïŒãããäžå¯èœãªå Žåã¯ããã€ãã£ãã¢ããªãžã®åãæ¿ããæ€èšããŠããŸãïŒ
Twilioãäœã§ãããããç¥ããªãã®ã§ïŒOKãã°ã°ã£ã:-)ïŒãæ¬åœã«ç¢ºä¿¡ãæãŠãŸããã ãã ãããããã«ããããã€ãã£ãã³ãŒããã€ã³ã¿ãŒãã§ã€ã¹ããå Žåã¯ããšã«ãããã©ãããã©ãŒã ãã£ãã«ã䜿çšããå¿ èŠããããŸãã ãã®Twilioã䜿çšããããã«èª°ããäœæããæ¢åã®ãã©ã°ã€ã³ã䜿çšããããèªåã§äœæãããïŒãã®å Žåãå®è³ªçã«åããã©ã°ã€ã³ãäœæããå ¬éããã«ããŒã«ã«ã§åç §ããŸãïŒããŸãã¯åã«é¢é£ãããã©ã°ã€ã³ãã³ããŒããŸãç¬èªã®ã¢ããªã«ã³ãŒããæ¿å ¥ããŸãïŒå€éšäŸåé¢ä¿ã«ã¯ãªããŸãããããã以å€ã¯ããšã«ããå®è³ªçã«åãã³ãŒãã«ãªããŸãïŒã
ãŸãããã©ãããã©ãŒã ãã£ãã«ãããå Žåã¯ãåã®åçãé©çšãããŸããéåžžã®Flutterã¢ããªã®ã¡ã€ã³ã¹ã¬ãããããã©ãããã©ãŒã ãã£ãã«ãšãã©ã°ã€ã³ãæ¢ã«äœ¿çšã§ããå Žåã¯ãããããã䜿çšããŠåé¢ããåããã®ã䜿çšã§ããŸãã 2ã€ã®ããã±ãŒãžã
ãããã£ãŠããã®åé¡ã¯2018幎1æ5æ¥ä»¥éã«ååšããè¿œå ã®åªåãæã£ãŠããŸã äžå¯èœã§ãã æäŸããããœãªã¥ãŒã·ã§ã³ã¯çŽ æŽãããã§ããããã¹ã¯ãããã§ã¯ãŸã äœãæ©èœããŠããŸããã ãããã£ãŠããã©ãã¿ãŒããã¹ã¯ãããã§ã©ãã ãããŸãæ©èœããŠããããè©Šããå°æ¥ã®è£œåãå®å
šã«ããã§ç«ã¡åŸçããå¯èœæ§ããããã©ããã確èªããã人ã®ããã«ã
ã»ãšãã©ãã¹ãŠã®ã¢ããªã¯åé¢ãå¿
èŠãšããŸããåžžã«ããã€ãã®å·šå€§ãªèšç®ãããããããã®ãããªéèŠãªApièšèšã®æ¬ é¥ã«äœãèµ·ãããªãå¯èœæ§ã¯ãããŸããïŒ
ãã©ã°ã€ã³ã®ã·ã¹ãã ã¢ã©ãŒããŠã£ã³ããŠã«ããã®ããã®æ¹æ³ãè¿œå ããŸãã
解決çã¯ããã«èšèŒãããŠããŸãéä¿¡ãåé¢ããŸãã
æäŸãããŠããäŸã§ã¯ãã·ã¹ãã ã¢ã©ãŒããŠã£ã³ããŠãã©ã°ã€ã³ã«åºæã®ããŒã¯ãæäŸãããŠããŸãããä»ã®ãã©ã°ã€ã³ã«ç°¡åã«è€è£œã§ããŸãã ãããŠããããæ©èœãããããã«ä»ã®è±ªè¯ãªãã©ã°ã€ã³ã¯å¿
èŠãããŸããïŒ
ããã¯ãŸã ããªãåé¡ã«ãªãå¯èœæ§ããããŸãã ããã¯ããã©ã°ã€ã³ã§äœããè¡ãã«ã¯ã¢ããªã¹ã³ãŒãã«ã¡ãã»ãŒãžãéä¿¡ããå¿ èŠããããããããã¯ã°ã©ãŠã³ã/ãã©ã¢ã°ã©ãŠã³ãã§å®è¡ãããŠããåé¢ãããã©ã°ã€ã³ãçŽæ¥åŒã³åºãæ¹æ³ããªãããšãæå³ããŸãã ãããã£ãŠãã¢ããªãå®è¡ãããŠããªãå Žåãããã¯ã°ã©ãŠã³ãã®ãã©ã°ã€ã³ã§äœãããæ¹æ³ã¯ãããŸããã
ãããã£ãŠãããšãã°ãã¢ããªãéãããšãã«FCMãã©ã°ã€ã³ã®backgroundMessageHandlerã§å ±æèšå®ã䜿çšããŠäœããå®è¡ãããå Žåã¯ãMissingPluginExceptionãã¹ããŒãããŸãã
ãŸãã¯ãã·ã¹ãã ã¢ã©ãŒããŠã£ã³ããŠã§ã¢ããªãéããããªãå Žåã ã¢ã©ãŒããŠã£ã³ããŠã¯å¥ã®åé¢ã§å®è¡ãããŠããŸãã ãã®ãããã¢ããªã®ã¹ã³ãŒãå ã§ã³ãŒããå®è¡ããå¿ èŠããããŸãã ã¢ããªã¯çŸåšéããŠãããããããã«ã¯åé¡ããããŸãã
ãããŠãããã倧ããªåé¡ã§ããä»ã®å€ãã®ã·ããªãªããããããããŸãã
@ michael-ããªãã説æããã·ããªãªã¯ããŸãã«åé¡ããªãã¯ãã®ã·ããªãªã§ãã ããã¯ã°ã©ãŠã³ãã§ã³ãŒããå®è¡ãããã©ã°ã€ã³ã¯ãéåžžãç¬èªã®ãã©ã°ã€ã³ã¬ãžã¹ããªã䜿çšããŠãŸã£ããæ°ããFlutterEngineãã€ã³ã¹ã¿ã³ã¹åãããã®äžã§å®è¡ãããåé¢ã¯ããã©ãããã©ãŒã ãã£ãã«ãä»ããŠãããã®ãã©ã°ã€ã³ãšçŽæ¥éä¿¡ã§ããããã«ãªããŸãã
ã¡ãªã¿ã«ããã©ã°ã€ã³ã䜿çšããããã«åé¢ãå¿ èŠãªå Žåãç°¡åãªæ¹æ³ã¯ããã®åé¢ãFlutterEngineã§ã©ããããã ãã§ãéæ³ã®ããã«ãããã®æ©èœãç¶æ¿ããããšãæå³ããŸãã ããã¯ãAndroidããã³iOSã§flutter_isolateããã±ãŒãžãè¡ãããšã§ãïŒãã ããåé¿çãããé©åãªä¿®æ£ãè¡ãæ¹ãããããšã«åæããŸããçŸåšå©çšå¯èœãªåé¿çã«ã¯ãããã«ããã¯ããªãŒããŒããããªã©ããããã¡ã³ããã³ã¹ãäžååã§ãããããµããŒããäžè¶³ããŠããå¯èœæ§ããããŸãããã¹ãŠã®ãã©ãããã©ãŒã ãïŒ
@ryanheiseã ããflutter_isolateã¯ç§ã®ããã«ãããããŸããïŒ ããã¥ã¡ã³ãããå®éã«ããããªãæ¹æ³ã FCM onBackgroundMessageã§æ©èœãããã«ã¯ãäœãããå¿ èŠããããŸããïŒ ãããã£ãŠãonBackgroundMessageHandlerã«æ°ããåé¢ãçæããå¿ èŠããããŸããïŒ ããããããã§ãã©ã°ã€ã³ã䜿çšããããšã¯ã§ããªãã®ã§ãflutter_isolateãã©ã®ããã«äœ¿çšããŸããïŒ
åé¡ã¯ãfirebase_messagingãé·ãéæŽæ°ãããŠããããææ°ã®ããã¯ã°ã©ãŠã³ãå®è¡APIãããã¯ããã«é ããŠããããšã§ãã ãã©ã°ã€ã³ãæŽæ°ããå Žåããã®åé¡ã¯çºçããªããªããŸãã ããäžåºŠæ確ã«ããããã«ãããªãã説æããçš®é¡ã®ã·ããªãªã¯ãæ£ããå®è£ ãããŠããã°ããã¯ã°ã©ãŠã³ãåé¢ããã§ã«ãã©ã°ã€ã³ã«ã¢ã¯ã»ã¹ã§ããã¯ããªã®ã§ãåé¡ããªãã¯ãã®ã·ããªãªã§ãã firebase_messagingãã©ã°ã€ã³ã¯ãææ°ã®APIã«åŸã£ãŠå®è£ ãããŠããªããããæ©èœããŸããã ãã®ãããžã§ã¯ãã§ãã°ã¬ããŒããæåºã§ããŸãã
ç§ã¯ããã«ã€ããŠå©ããåå®ã«å¿ èŠãšããŠããŸãã ç§ããããè¡ãããšãã§ããæ¹æ³ã¯ãããããããŸããïŒ ç§ã¯ææ¥æåã®æ·±å»ãªååŒãããŸããããããŠç§ã¯ãããç解ããããšãã§ããŸããã
ãã©ã°ã€ã³ãããŒããããŠããããšã確èªããããã«ãã¹ãŠãè¡ããŸãã ããã¯ã°ã©ãŠã³ãã¡ãã»ãŒãžãæå¹ã«ããæ¹æ³ã«ã€ããŠREADMEã®æ瀺ã«åŸã£ããã©ããã¯ããããŸãããããã©ã°ã€ã³ã®ããã¯ã°ã©ãŠã³ãFlutterNativeViewã®åæåã«ããã¯ããã«ã¹ã¿ã Applicationã¯ã©ã¹ãäœæããå¿ èŠããããŸãã ãŸã è¡ã£ãŠããªãå Žåã¯ãã©ã®ãã©ã°ã€ã³ã䜿çšã§ããŸããã ããã§ãåé¡ã解決ããªãå Žåã¯ããããžã§ã¯ããå€ãv1ã¹ã¿ã€ã«ã®ãã©ã°ã€ã³ã¢ãŒããã¯ãã£ã«ããŠã³ã°ã¬ãŒãããŠã¿ãŠãã ããïŒv2ãå¿ èŠãšããä»ã®ãã©ã°ã€ã³ãå£ããªã¹ã¯ããããŸãïŒã
Application.ktããã®ããã«èšå®ããŸã
import `in`.jvapps.system_alert_window.SystemAlertWindowPlugin
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService
import android.os.Build
import android.app.NotificationManager
import android.app.NotificationChannel
public class Application: FlutterApplication(), PluginRegistrantCallback {
override fun onCreate() {
super.onCreate()
FlutterFirebaseMessagingService.setPluginRegistrant(this)
createNotificationChannels()
SystemAlertWindowPlugin.setPluginRegistrant(this)
}
override fun registerWith(registry: PluginRegistry) {
FirebaseCloudMessagingPluginRegistrant.registerWith(registry)
SystemAlertWindowPlugin.registerWith(registry.registrarFor("in.jvapps.system_alert_window"))
}
fun createNotificationChannels() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "groupChannel"
val descriptionText = "This is the group channel"
val importance = NotificationManager.IMPORTANCE_HIGH
val mChannel = NotificationChannel("59054", name, importance)
mChannel.description = descriptionText
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)
}
}
}
ãã®åé¡ãšã¯é¢ä¿ããªããããfirebase_messagingã®åé¡ããŒãžã«æçš¿ããããšããå§ãããŸãã
ãSchedulerBindingãçšã®æ°ãããspawnIsolateãã¡ãœãããæã€PRãäœæã§ããŸãã
次ã«ããã®åé¢ã§ãã©ãããã©ãŒã ã¡ãœãããåŒã³åºãããšãå¯èœã«ãªããŸãã
ããã¯ããã©ãããã©ãŒã ã¡ãœãããåŒã³åºããŠå¿çãååŸããå¿ èŠãããå Žåã«ã®ã¿åœ¹ç«ã¡ãŸãã
import 'dart:async';
import 'dart:isolate';
import 'package:flutter/scheduler.dart';
import 'package:flutter/widgets.dart';
import 'package:path_provider/path_provider.dart';
Future<void> _test(SendPort sendPort) async {
final dir = await getTemporaryDirectory();
sendPort.send(dir);
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final Completer<Object> completer = Completer<Object>();
final RawReceivePort receivePort = RawReceivePort(completer.complete);
final Isolate isolate = await ServicesBinding.instance.spawnIsolate(
_test,
receivePort.sendPort,
);
print(await completer.future);
receivePort.close();
isolate.kill();
}
ãã°
Performing hot restart...
Syncing files to device Pixel 4...
Restarted application in 722ms.
I/flutter (11705): Directory: '/data/user/0/com.example.bug/cache'
ãSchedulerBindingãçšã®æ°ãããspawnIsolateãã¡ãœãããæã€PRãäœæã§ããŸãã
次ã«ããã®åé¢ã§ãã©ãããã©ãŒã ã¡ãœãããåŒã³åºãããšãå¯èœã«ãªããŸãã
ããã¯ããã©ãããã©ãŒã ã¡ãœãããåŒã³åºããŠå¿çãååŸããå¿ èŠãããå Žåã«ã®ã¿åœ¹ç«ã¡ãŸãã
SchedulerBinding.instance.spawnIsolate
ããããã¹ããããã£ã³ã¹ã¯ãããŸããïŒ ãããç§ã®ããŒãºãªã©ã«åããªã..
@Nailik
ãã®ãã¡ã€ã«ã眮ãæããŸãïŒããŒãžã§ã³1.17.5ã®å Žåã¯å®éïŒbinding.dart
`` `dart // Copyright 2014 The FlutterAuthorsã å
šèäœæš©ææã
//ãã®ãœãŒã¹ã³ãŒãã®äœ¿çšã¯ã次ã®ãããªBSDã¹ã¿ã€ã«ã®ã©ã€ã»ã³ã¹ã«ãã£ãŠç®¡çãããŸãã
// LICENSEãã¡ã€ã«ã«ãããŸãã
import'dartïŒasync ';
import'dartïŒisolate ';
import'dartïŒtyped_data ';
' dartïŒui 'ãuiãšããŠã€ã³ããŒãããŸãã
import'packageïŒflutter / Foundation.dart ';
import'asset_bundle.dart ';
import'binary_messenger.dart ';
import'system_channels.dart ';
///ãã©ãããã©ãŒã ã¡ãã»ãŒãžããªãã¹ã³ãããããã[defaultBinaryMessenger]ã«è»¢éããŸãã
///
/// [ServicesBinding]ã¯ãå
¬éãã[LicenseEntryCollector]ãç»é²ããŸã
///ã¢ã»ããã®ã«ãŒãã«ä¿åãããŠããLICENSE
ãã¡ã€ã«ã«ããã©ã€ã»ã³ã¹
///ãã³ãã«ãã ext.flutter.evict
ãµãŒãã¹æ¡åŒµæ©èœãå®è£
ããŸãïŒãåç
§ïŒ
/// [evict]ïŒã
BindingBaseäžã®mixinServicesBinding {
@ãªãŒããŒã©ã€ã
void initInstancesïŒïŒ{
super.initInstancesïŒïŒ;
_instance = this;
_defaultBinaryMessenger = createBinaryMessengerïŒïŒ;
window.onPlatformMessage = defaultBinaryMessenger.handlePlatformMessage;
initLicensesïŒïŒ;
SystemChannels.system.setMessageHandlerïŒhandleSystemMessageïŒ;
}
///çŸåšã®[ServicesBinding]ïŒäœæãããŠããå ŽåïŒã
static ServicesBinding get instance => _instance;
static ServicesBinding _instance;
/// [BinaryMessenger]ã®ããã©ã«ãã€ã³ã¹ã¿ã³ã¹ã
///
///ããã¯ãã¢ããªã±ãŒã·ã§ã³ãããã©ãããã©ãŒã ã«ã¡ãã»ãŒãžãéä¿¡ããããã«äœ¿çšããã
///åãã£ãã«ã«ç»é²ãããŠãããã³ãã©ãŒã远跡ããã®ã§
///ç»é²ããããã³ãã©ãŒã«çä¿¡ã¡ãã»ãŒãžããã£ã¹ãããããå ŽåããããŸãã
BinaryMessenger get defaultBinaryMessenger => _defaultBinaryMessenger;
BinaryMessenger _defaultBinaryMessenger;
///éä¿¡ã«äœ¿çšã§ããããã©ã«ãã®[BinaryMessenger]ã€ã³ã¹ã¿ã³ã¹ãäœæããŸã
///ãã©ãããã©ãŒã ã¡ãã»ãŒãžã
@protected
BinaryMessenger createBinaryMessengerïŒïŒ{
const _DefaultBinaryMessenger ._ïŒïŒ;ãè¿ããŸãã
}
///[SystemChannels.system]ã§åä¿¡ããã¡ãã»ãŒãžãåŒã³åºããã³ãã©ãŒ
///ã¡ãã»ãŒãžãã£ãã«ã
///
///ä»ã®ãã€ã³ãã£ã³ã°ãããããªãŒããŒã©ã€ãããŠãçä¿¡ã·ã¹ãã ã¡ãã»ãŒãžã«å¿çããå ŽåããããŸãã
@protected
@mustCallSuper
æªæ¥
///é¢é£ããã©ã€ã»ã³ã¹ã[LicenseRegistry]ã«è¿œå ããŸãã
///
///ããã©ã«ãã§ã¯ã[ServicesBinding]ã®[initLicenses]ã®å®è£
ã¯è¿œå ããŸã
///ã³ã³ãã€ã«äžã«flutter
ããŒã«ã«ãã£ãŠåéããããã¹ãŠã®ã©ã€ã»ã³ã¹ã
@protected
@mustCallSuper
void initLicensesïŒïŒ{
LicenseRegistry.addLicenseïŒ_addLicensesïŒ;
}
ã¹ããªãŒã
//ããã§ã¯ïŒã¹ã±ãžã¥ãŒã©ãã€ã³ãã£ã³ã°ã®scheduleTaskã§ã¯ãªãïŒã¿ã€ããŒã䜿çšããŸã
//ãµãŒãã¹ã¬ã€ã€ãŒã¯ã¹ã±ãžã¥ãŒã©ãã€ã³ãã£ã³ã°ã䜿çšã§ããªãããïŒã¹ã±ãžã¥ãŒã©
//ãã€ã³ãã£ã³ã°ã¯ãµãŒãã¹ã¬ã€ã€ãŒã䜿çšããŠã©ã€ããµã€ã¯ã«ã€ãã³ãã管çããŸãïŒã ã¿ã€ããŒ
//ãšã«ããscheduleTaskãå
éšã§äœ¿çšãããã®ã§ãã å¯äžã®éãã¯
//ãããã¯ã
//å®è¡ãããŠããå¯èœæ§ã®ããä»ã®ã¿ã¹ã¯ã ããã§_äœã_ã䜿çšããŠäžæãã
//åé¢ã¯ã³ããŒã«æéãããããããããã2ã€ã®éšåã«åå²ããããšãéèŠã§ã
//çŸæç¹ã§ã®ããŒã¿ãããã³åãã€ãã³ãã«ãŒãã§ããŒã¿ãåä¿¡ããå Žå
//ããŒã¿ã次ã®åé¢ã«éä¿¡ãããšãã®å埩ãç§ãã¡ã¯ééããªã
//ãã¬ãŒã ãèŠéããŸãã å¥ã®è§£æ±ºçã¯ããã¹ãŠã®äœæ¥ãè¡ãããšã§ã
// 1ã€ã®åé¢ã§çºçããæçµçã«ããã«è¡ãå¯èœæ§ããããŸãããæåã¯
//åé¢éä¿¡ãããå®ãã§ãããã©ããã確èªããŸãã
//åç
§ïŒ https ïŒ//github.com/dart-lang/sdk/issues/31959
// https://github.com/dart-lang/sdk/issues/31960
// TODOïŒianhïŒïŒãããã®ãã°ãä¿®æ£ããããããã®è€éããåãé€ããŸãã
ãã¡ã€ãã«ã³ã³ããªãŒã¿ãŒ
Timer.runïŒïŒïŒasync {
rawLicenses.completeïŒrootBundle.loadStringïŒ 'LICENSE'ãcacheïŒfalseïŒïŒ;
}ïŒ;
rawLicenses.futureãåŸ
ã¡ãŸãã
ãã¡ã€ãã«ã³ã³ããªãŒã¿ãŒ> parsedLicenses =ã³ã³ããªãŒã¿ãŒ
>ïŒïŒ;
Timer.runïŒïŒïŒasync {
parsedLicenses.completeïŒcomputeïŒ_parseLicensesãawait rawLicenses.futureãdebugLabelïŒ 'parseLicenses'ïŒïŒ;
}ïŒ;
parsedLicenses.futureãåŸ
ã¡ãŸãã
ã€ãŒã«ã*ã¹ããªãŒã
}
//ããã¯ãäžèšã®_addLicensesã«ãã£ãŠäœæãããå¥ã®åé¢ã§å®è¡ãããŸãã
éçãªã¹ã
æçµçãªæåå_licenseSeparator = '\ n' +ïŒ '-' * 80ïŒ+ '\ n';
æçµãªã¹ã
æçµãªã¹ã
forïŒã©ã€ã»ã³ã¹ã®æçµçãªæååã©ã€ã»ã³ã¹ïŒ{
final int split = license.indexOfïŒ '\ n \ n'ïŒ;
ifïŒsplit> = 0ïŒ{
result.addïŒLicenseEntryWithLineBreaksïŒ
license.substringïŒ0ãsplitïŒ.splitïŒ '\ n'ïŒã
license.substringïŒsplit + 2ïŒã
ïŒïŒ;
} ããä»¥å€ {
result.addïŒLicenseEntryWithLineBreaksïŒconst
}
}
çµæãè¿ããŸãã
}
@ãªãŒããŒã©ã€ã
void initServiceExtensionsïŒïŒ{
super.initServiceExtensionsïŒïŒ;
assert(() {
registerStringServiceExtension(
// ext.flutter.evict value=foo.png will cause foo.png to be evicted from
// the rootBundle cache and cause the entire image cache to be cleared.
// This is used by hot reload mode to clear out the cache of resources
// that have changed.
name: 'evict',
getter: () async => '',
setter: (String value) async {
evict(value);
},
);
return true;
}());
}
/// ext.flutter.evict
ãµãŒãã¹æ¡åŒµã«å¿çããŠåŒã³åºãããŸãã
///
///ããã¯ãããããªããŒãäžã«flutter
ããŒã«ã«ãã£ãŠäœ¿çšãããããããã¹ãŠã®ç»åã
///ãã£ã¹ã¯äžã§å€æŽããããã®ã¯ãã£ãã·ã¥ããã¯ãªã¢ãããŸãã
@protected
@mustCallSuper
void evictïŒæååã¢ã»ããïŒ{
rootBundle.evictïŒassetïŒ;
}
æªæ¥
FutureOr
Tã¡ãã»ãŒãžã{
bool paused = falseã
bool errorsAreFatalã
SendPort onExitã
SendPort onErrorã
æåådebugNameã
}ïŒ{
䞻匵ããïŒ
_isMainIsolateã
ãè€æ°ã¬ãã«ã®åé¢ãäœæããããšã¯ã§ããŸãããã
ïŒ;
final RawReceivePort messageReceiver = RawReceivePort(
(Object receivedMessage) async {
if (receivedMessage is SendPort) {
receivedMessage.send(
_IsolateStarter<T>(
ui.PluginUtilities.getCallbackHandle(entryPoint),
message,
),
);
} else if (receivedMessage is _Message) {
final ByteData result = await defaultBinaryMessenger.send(
receivedMessage.channel,
receivedMessage.message,
);
receivedMessage.sendPort.send(result);
}
},
);
RawReceivePort onExitReceiver;
onExitReceiver = RawReceivePort(
(Object message) {
onExit?.send(message);
onExitReceiver.close();
messageReceiver.close();
},
);
return Isolate.spawn(
_startIsolate,
messageReceiver.sendPort,
paused: paused,
errorsAreFatal: true,
onExit: onExitReceiver.sendPort,
onError: onError,
debugName: debugName,
);
}
}
æªæ¥
_sendPortToMainIsolate = sendPort;
_IsolateBindingïŒïŒ;
æçµã³ã³ããªãŒã¿ãŒ<_IsolateStarter
ã³ã³ããªãŒã¿ãŒ<_IsolateStarter
æçµçãªRawReceivePortreceivePort = RawReceivePortïŒ
ïŒãªããžã§ã¯ãisolateStarterïŒ{
assertïŒisolateStarter is _IsolateStarter
completer.completeïŒisolateStarter as _IsolateStarter
}ã
ïŒ;
sendPort.sendïŒreceivePort.sendPortïŒ;
æçµçãª_IsolateStarter
receivePort.closeïŒïŒ;
æçµé¢æ°é¢æ°=
ui.PluginUtilities.getCallbackFromHandleïŒisolateStarter.callbackHandleïŒ;
await functionïŒisolateStarter.messageïŒ;
}
SendPort _sendPortToMainIsolate;
bool get _isMainIsolate => _sendPortToMainIsolate == null;
ã¯ã©ã¹_IsolateStarter
_IsolateStarterïŒthis.callbackHandleãthis.messageïŒ;
æçµçãªui.CallbackHandlecallbackHandle;
æåŸã®Tã¡ãã»ãŒãžã
}
ã¯ã©ã¹_ã¡ãã»ãŒãž{
_ã¡ãã»ãŒãžïŒ
this.channelã
ãã®ã¡ãã»ãŒãžã
this.sendPortã
ïŒ;
æçµçãªæååãã£ãã«ã
æçµçãªByteDataã¡ãã»ãŒãžã
æçµçãªSendPortsendPort;
}
class _IsolateBindingã¯ãServicesBinding {}ã䜿çšããŠBindingBaseãæ¡åŒµããŸã
/// [BinaryMessenger]ã®ããã©ã«ãã®å®è£
ã
///
///ãã®ã¡ãã»ã³ãžã£ãŒã¯ãã¢ããªåŽãããã©ãããã©ãŒã åŽã«ã¡ãã»ãŒãžãéä¿¡ãã
///ãã©ãããã©ãŒã åŽããé©åãªå Žæã«çä¿¡ã¡ãã»ãŒãžããã£ã¹ãããããŸã
///ãã³ãã©ãŒã
class _DefaultBinaryMessenger extends BinaryMessenger {
const _DefaultBinaryMessenger ._ïŒïŒ;
//ãã©ãããã©ãŒã ãã©ã°ã€ã³ããã®çä¿¡ã¡ãã»ãŒãžã®ãã³ãã©ãŒã
//ããã¯éçã§ããããããã®ã¯ã©ã¹ã¯constã³ã³ã¹ãã©ã¯ã¿ãŒãæã€ããšãã§ããŸãã
éçæçµããã
//éä¿¡ã¡ãã»ãŒãžãååããŠå¿çããã¢ãã¯ãã³ãã©ãŒã
//ããã¯éçã§ããããããã®ã¯ã©ã¹ã¯constã³ã³ã¹ãã©ã¯ã¿ãŒãæã€ããšãã§ããŸãã
éçæçµããã
æªæ¥
ãã¡ã€ãã«ã³ã³ããªãŒã¿ãŒ
if (_isMainIsolate) {
// ui.window is accessed directly instead of using ServicesBinding.instance.window
// because this method might be invoked before any binding is initialized.
// This issue was reported in #27541. It is not ideal to statically access
// ui.window because the Window may be dependency injected elsewhere with
// a different instance. However, static access at this location seems to be
// the least bad option.
ui.window.sendPlatformMessage(channel, message, (ByteData reply) {
try {
completer.complete(reply);
} catch (exception, stack) {
FlutterError.reportError(FlutterErrorDetails(
exception: exception,
stack: stack,
library: 'services library',
context:
ErrorDescription('during a platform message response callback'),
));
}
});
} else {
RawReceivePort receivePort;
receivePort = RawReceivePort(
(Object message) async {
assert(message is ByteData);
completer.complete(message as ByteData);
receivePort.close();
},
);
_sendPortToMainIsolate.send(
_Message(channel, message, receivePort.sendPort),
);
}
return completer.future;
}
@ãªãŒããŒã©ã€ã
æªæ¥
æååãã£ãã«ã
ByteDataããŒã¿ã
ui.PlatformMessageResponseCallbackã³ãŒã«ããã¯ã
ïŒéåæ{
ByteDataå¿ç;
è©Šã {
æçµçãªMessageHandlerãã³ãã©ãŒ= _handlers [channel];
ifïŒhandlerïŒ= nullïŒ{
response = await handlerïŒdataïŒ;
} ããä»¥å€ {
ui.channelBuffers.pushïŒchannelãdataãcallbackïŒ;
ã³ãŒã«ããã¯= null;
}
} catchïŒäŸå€ãã¹ã¿ãã¯ïŒ{
FlutterError.reportErrorïŒFlutterErrorDetailsïŒ
äŸå€ïŒäŸå€ã
ã¹ã¿ãã¯ïŒã¹ã¿ãã¯ã
ã©ã€ãã©ãªïŒ 'ãµãŒãã¹ã©ã€ãã©ãª'ã
ã³ã³ããã¹ãïŒErrorDescriptionïŒ 'ãã©ãããã©ãŒã ã¡ãã»ãŒãžã³ãŒã«ããã¯äž'ïŒã
ïŒïŒ;
} ã€ãã« {
ifïŒcallbackïŒ= nullïŒ{
ã³ãŒã«ããã¯ïŒå¿çïŒ;
}
}
}
@ãªãŒããŒã©ã€ã
æªæ¥
æçµçãªMessageHandlerãã³ãã©ãŒ= _mockHandlers [channel];
ifïŒhandlerïŒ= nullïŒ
ãã³ãã©ãŒïŒã¡ãã»ãŒãžïŒãè¿ããŸãã
return _sendPlatformMessageïŒchannelãmessageïŒ;
}
@ãªãŒããŒã©ã€ã
void setMessageHandlerïŒString channelãMessageHandler handlerïŒ{
ifïŒhandler == nullïŒ
_handlers.removeïŒchannelïŒ;
ãã以å€
_handlers [channel] =ãã³ãã©ãŒ;
ui.channelBuffers.drainïŒchannelãïŒByteData dataãui.PlatformMessageResponseCallback callbackïŒasync {
handlePlatformMessageïŒchannelãdataãcallbackïŒ;ãåŸ
ã¡ãŸãã
}ïŒ;
}
@ãªãŒããŒã©ã€ã
void setMockMessageHandlerïŒString channelãMessageHandler handlerïŒ{
ifïŒhandler == nullïŒ
_mockHandlers.removeïŒchannelïŒ;
ãã以å€
_mockHandlers [channel] =ãã³ãã©ãŒ;
}
}
`` `
ç§ã¯ãã©ãã¿ãŒ1.21ãæã£ãŠããã®ã§ãã³ã³ãã€ã«ããããã«ãã¹ãŠã®ã³ãŒããæŽæ°ããããšããŸããã
_IsolateBindingã«ã¯BindingBaseã¡ãœããã®å€ãã®å®è£
ãæ¬ èœããŠããããã1ã€ã®åé¡ãæ®ã£ãŠããŸã...
ç§ã¯sthã®ããã«ãªããŸã
Error: The non-abstract class '_IsolateBinding' is missing implementations for these members:
- BindingBase with ServicesBinding.SchedulerBinding.addPersistentFrameCallback
çŽ30åã
æåŸã«ã³ã³ãœãŒã«ãå°å·ãããŸã
/C:/flutter/packages/flutter/lib/src/services/binding.dart:341:7: Error: 'BindingBase' doesn't implement 'SchedulerBinding' so it can't be used with 'ServicesBinding'.
- 'BindingBase' is from 'package:flutter/src/foundation/binding.dart' ('/C:/flutter/packages/flutter/lib/src/foundation/binding.dart').
- 'SchedulerBinding' is from 'package:flutter/src/scheduler/binding.dart' ('/C:/flutter/packages/flutter/lib/src/scheduler/binding.dart').
- 'ServicesBinding' is from 'package:flutter/src/services/binding.dart' ('/C:/flutter/packages/flutter/lib/src/services/binding.dart').
class _IsolateBinding extends BindingBase with ServicesBinding {}
_startIsolate
ã§ã®_IsolateBinding()
ã®åŒã³åºããäœãããã®ãã100ïŒ
ããããŸããããããããServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
ãšã©ãŒãçºçããŸãã
ç§ã¯ãããä¿®æ£ããããšããŸããããããã¯ã¹ã€ã³ã«é¢ããç§ã®ç¥èã¯ãŸã ããã»ã©è¯ããªããšæããŸãã
ãããä¿®æ£ããæ¹æ³ã¯ãããŸããïŒ
æ°ãããã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãïŒãããŸã§ã®ãšããïŒ
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// <strong i="24">@dart</strong> = 2.8
import 'dart:async';
import 'dart:isolate';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:flutter/scheduler.dart';
import 'asset_bundle.dart';
import 'binary_messenger.dart';
import 'restoration.dart';
import 'system_channels.dart';
/// Listens for platform messages and directs them to the [defaultBinaryMessenger].
///
/// The [ServicesBinding] also registers a [LicenseEntryCollector] that exposes
/// the licenses found in the `LICENSE` file stored at the root of the asset
/// bundle, and implements the `ext.flutter.evict` service extension (see
/// [evict]).
mixin ServicesBinding on BindingBase, SchedulerBinding {
<strong i="25">@override</strong>
void initInstances() {
super.initInstances();
_instance = this;
_defaultBinaryMessenger = createBinaryMessenger();
_restorationManager = createRestorationManager();
window.onPlatformMessage = defaultBinaryMessenger.handlePlatformMessage;
initLicenses();
SystemChannels.system.setMessageHandler(handleSystemMessage);
SystemChannels.lifecycle.setMessageHandler(_handleLifecycleMessage);
readInitialLifecycleStateFromNativeWindow();
}
/// The current [ServicesBinding], if one has been created.
static ServicesBinding get instance => _instance;
static ServicesBinding _instance;
/// The default instance of [BinaryMessenger].
///
/// This is used to send messages from the application to the platform, and
/// keeps track of which handlers have been registered on each channel so
/// it may dispatch incoming messages to the registered handler.
BinaryMessenger get defaultBinaryMessenger => _defaultBinaryMessenger;
BinaryMessenger _defaultBinaryMessenger;
/// Creates a default [BinaryMessenger] instance that can be used for sending
/// platform messages.
<strong i="26">@protected</strong>
BinaryMessenger createBinaryMessenger() {
return const _DefaultBinaryMessenger._();
}
/// Called when the operating system notifies the application of a memory
/// pressure situation.
///
/// This method exposes the `memoryPressure` notification from
/// [SystemChannels.system].
<strong i="27">@protected</strong>
<strong i="28">@mustCallSuper</strong>
void handleMemoryPressure() { }
/// Handler called for messages received on the [SystemChannels.system]
/// message channel.
///
/// Other bindings may override this to respond to incoming system messages.
<strong i="29">@protected</strong>
<strong i="30">@mustCallSuper</strong>
Future<void> handleSystemMessage(Object systemMessage) async {
final Map<String, dynamic> message = systemMessage as Map<String, dynamic>;
final String type = message['type'] as String;
switch (type) {
case 'memoryPressure':
handleMemoryPressure();
break;
}
return;
}
/// Adds relevant licenses to the [LicenseRegistry].
///
/// By default, the [ServicesBinding]'s implementation of [initLicenses] adds
/// all the licenses collected by the `flutter` tool during compilation.
<strong i="31">@protected</strong>
<strong i="32">@mustCallSuper</strong>
void initLicenses() {
LicenseRegistry.addLicense(_addLicenses);
}
Stream<LicenseEntry> _addLicenses() async* {
// We use timers here (rather than scheduleTask from the scheduler binding)
// because the services layer can't use the scheduler binding (the scheduler
// binding uses the services layer to manage its lifecycle events). Timers
// are what scheduleTask uses under the hood anyway. The only difference is
// that these will just run next, instead of being prioritized relative to
// the other tasks that might be running. Using _something_ here to break
// this into two parts is important because isolates take a while to copy
// data at the moment, and if we receive the data in the same event loop
// iteration as we send the data to the next isolate, we are definitely
// going to miss frames. Another solution would be to have the work all
// happen in one isolate, and we may go there eventually, but first we are
// going to see if isolate communication can be made cheaper.
// See: https://github.com/dart-lang/sdk/issues/31959
// https://github.com/dart-lang/sdk/issues/31960
// TODO(ianh): Remove this complexity once these bugs are fixed.
final Completer<String> rawLicenses = Completer<String>();
scheduleTask(() async {
rawLicenses.complete(await rootBundle.loadString('NOTICES', cache: false));
}, Priority.animation);
await rawLicenses.future;
final Completer<List<LicenseEntry>> parsedLicenses = Completer<List<LicenseEntry>>();
scheduleTask(() async {
parsedLicenses.complete(compute(_parseLicenses, await rawLicenses.future, debugLabel: 'parseLicenses'));
}, Priority.animation);
await parsedLicenses.future;
yield* Stream<LicenseEntry>.fromIterable(await parsedLicenses.future);
}
// This is run in another isolate created by _addLicenses above.
static List<LicenseEntry> _parseLicenses(String rawLicenses) {
final String _licenseSeparator = '\n' + ('-' * 80) + '\n';
final List<LicenseEntry> result = <LicenseEntry>[];
final List<String> licenses = rawLicenses.split(_licenseSeparator);
for (final String license in licenses) {
final int split = license.indexOf('\n\n');
if (split >= 0) {
result.add(LicenseEntryWithLineBreaks(
license.substring(0, split).split('\n'),
license.substring(split + 2),
));
} else {
result.add(LicenseEntryWithLineBreaks(const <String>[], license));
}
}
return result;
}
<strong i="33">@override</strong>
void initServiceExtensions() {
super.initServiceExtensions();
assert(() {
registerStringServiceExtension(
// ext.flutter.evict value=foo.png will cause foo.png to be evicted from
// the rootBundle cache and cause the entire image cache to be cleared.
// This is used by hot reload mode to clear out the cache of resources
// that have changed.
name: 'evict',
getter: () async => '',
setter: (String value) async {
evict(value);
},
);
return true;
}());
}
/// Called in response to the `ext.flutter.evict` service extension.
///
/// This is used by the `flutter` tool during hot reload so that any images
/// that have changed on disk get cleared from caches.
<strong i="34">@protected</strong>
<strong i="35">@mustCallSuper</strong>
void evict(String asset) {
rootBundle.evict(asset);
}
Future<Isolate> spawnIsolate<T>(
FutureOr<void> entryPoint(T message),
T message, {
bool paused = false,
bool errorsAreFatal,
SendPort onExit,
SendPort onError,
String debugName,
}) {
assert(
_isMainIsolate,
'Can\'t make multiple levels of isolates',
);
final RawReceivePort messageReceiver = RawReceivePort(
(Object receivedMessage) async {
if (receivedMessage is SendPort) {
receivedMessage.send(
_IsolateStarter<T>(
ui.PluginUtilities.getCallbackHandle(entryPoint),
message,
),
);
} else if (receivedMessage is _Message) {
final ByteData result = await defaultBinaryMessenger.send(
receivedMessage.channel,
receivedMessage.message,
);
receivedMessage.sendPort.send(result);
}
},
);
RawReceivePort onExitReceiver;
onExitReceiver = RawReceivePort(
(Object message) {
onExit?.send(message);
onExitReceiver.close();
messageReceiver.close();
},
);
return Isolate.spawn(
_startIsolate,
messageReceiver.sendPort,
paused: paused,
errorsAreFatal: true,
onExit: onExitReceiver.sendPort,
onError: onError,
debugName: debugName,
);
}
// App life cycle
/// Initializes the [lifecycleState] with the [Window.initialLifecycleState]
/// from the window.
///
/// Once the [lifecycleState] is populated through any means (including this
/// method), this method will do nothing. This is because the
/// [Window.initialLifecycleState] may already be stale and it no longer makes
/// sense to use the initial state at dart vm startup as the current state
/// anymore.
///
/// The latest state should be obtained by subscribing to
/// [WidgetsBindingObserver.didChangeAppLifecycleState].
<strong i="36">@protected</strong>
void readInitialLifecycleStateFromNativeWindow() {
if (lifecycleState != null) {
return;
}
final AppLifecycleState state = _parseAppLifecycleMessage(window.initialLifecycleState);
if (state != null) {
handleAppLifecycleStateChanged(state);
}
}
Future<String> _handleLifecycleMessage(String message) async {
handleAppLifecycleStateChanged(_parseAppLifecycleMessage(message));
return null;
}
static AppLifecycleState _parseAppLifecycleMessage(String message) {
switch (message) {
case 'AppLifecycleState.paused':
return AppLifecycleState.paused;
case 'AppLifecycleState.resumed':
return AppLifecycleState.resumed;
case 'AppLifecycleState.inactive':
return AppLifecycleState.inactive;
case 'AppLifecycleState.detached':
return AppLifecycleState.detached;
}
return null;
}
/// The [RestorationManager] synchronizes the restoration data between
/// engine and framework.
///
/// See the docs for [RestorationManager] for a discussion of restoration
/// state and how it is organized in Flutter.
///
/// To use a different [RestorationManager] subclasses can override
/// [createRestorationManager], which is called to create the instance
/// returned by this getter.
RestorationManager get restorationManager => _restorationManager;
RestorationManager _restorationManager;
/// Creates the [RestorationManager] instance available via
/// [restorationManager].
///
/// Can be overriden in subclasses to create a different [RestorationManager].
<strong i="37">@protected</strong>
RestorationManager createRestorationManager() {
return RestorationManager();
}
}
Future<void> _startIsolate<T>(SendPort sendPort) async {
_sendPortToMainIsolate = sendPort;
_IsolateBinding();
final Completer<_IsolateStarter<T>> completer =
Completer<_IsolateStarter<T>>();
final RawReceivePort receivePort = RawReceivePort(
(Object isolateStarter) {
assert(isolateStarter is _IsolateStarter<T>);
completer.complete(isolateStarter as _IsolateStarter<T>);
},
);
sendPort.send(receivePort.sendPort);
final _IsolateStarter<T> isolateStarter = await completer.future;
receivePort.close();
final Function function =
ui.PluginUtilities.getCallbackFromHandle(isolateStarter.callbackHandle);
await function(isolateStarter.message);
}
SendPort _sendPortToMainIsolate;
bool get _isMainIsolate => _sendPortToMainIsolate == null;
class _IsolateStarter<T> {
_IsolateStarter(this.callbackHandle, this.message);
final ui.CallbackHandle callbackHandle;
final T message;
}
class _Message {
_Message(
this.channel,
this.message,
this.sendPort,
);
final String channel;
final ByteData message;
final SendPort sendPort;
}
//TODO not working
class _IsolateBinding extends BindingBase with ServicesBinding {}
/// The default implementation of [BinaryMessenger].
///
/// This messenger sends messages from the app-side to the platform-side and
/// dispatches incoming messages from the platform-side to the appropriate
/// handler.
class _DefaultBinaryMessenger extends BinaryMessenger {
const _DefaultBinaryMessenger._();
// Handlers for incoming messages from platform plugins.
// This is static so that this class can have a const constructor.
static final Map<String, MessageHandler> _handlers =
<String, MessageHandler>{};
// Mock handlers that intercept and respond to outgoing messages.
// This is static so that this class can have a const constructor.
static final Map<String, MessageHandler> _mockHandlers =
<String, MessageHandler>{};
Future<ByteData> _sendPlatformMessage(String channel, ByteData message) {
final Completer<ByteData> completer = Completer<ByteData>();
if (_isMainIsolate) {
// ui.window is accessed directly instead of using ServicesBinding.instance.window
// because this method might be invoked before any binding is initialized.
// This issue was reported in #27541. It is not ideal to statically access
// ui.window because the Window may be dependency injected elsewhere with
// a different instance. However, static access at this location seems to be
// the least bad option.
ui.window.sendPlatformMessage(channel, message, (ByteData reply) {
try {
completer.complete(reply);
} catch (exception, stack) {
FlutterError.reportError(FlutterErrorDetails(
exception: exception,
stack: stack,
library: 'services library',
context:
ErrorDescription('during a platform message response callback'),
));
}
});
} else {
RawReceivePort receivePort;
receivePort = RawReceivePort(
(Object message) async {
assert(message is ByteData);
completer.complete(message as ByteData);
receivePort.close();
},
);
_sendPortToMainIsolate.send(
_Message(channel, message, receivePort.sendPort),
);
}
return completer.future;
}
<strong i="38">@override</strong>
Future<void> handlePlatformMessage(
String channel,
ByteData data,
ui.PlatformMessageResponseCallback callback,
) async {
ByteData response;
try {
final MessageHandler handler = _handlers[channel];
if (handler != null) {
response = await handler(data);
} else {
ui.channelBuffers.push(channel, data, callback);
callback = null;
}
} catch (exception, stack) {
FlutterError.reportError(FlutterErrorDetails(
exception: exception,
stack: stack,
library: 'services library',
context: ErrorDescription('during a platform message callback'),
));
} finally {
if (callback != null) {
callback(response);
}
}
}
<strong i="39">@override</strong>
Future<ByteData> send(String channel, ByteData message) {
final MessageHandler handler = _mockHandlers[channel];
if (handler != null)
return handler(message);
return _sendPlatformMessage(channel, message);
}
<strong i="40">@override</strong>
void setMessageHandler(String channel, MessageHandler handler) {
if (handler == null)
_handlers.remove(channel);
else
_handlers[channel] = handler;
ui.channelBuffers.drain(channel, (ByteData data, ui.PlatformMessageResponseCallback callback) async {
await handlePlatformMessage(channel, data, callback);
});
}
<strong i="41">@override</strong>
void setMockMessageHandler(String channel, MessageHandler handler) {
if (handler == null)
_mockHandlers.remove(channel);
else
_mockHandlers[channel] = handler;
}
<strong i="42">@override</strong>
bool checkMessageHandler(String channel, MessageHandler handler) => _handlers[channel] == handler;
<strong i="43">@override</strong>
bool checkMockMessageHandler(String channel, MessageHandler handler) => _mockHandlers[channel] == handler;
}
@Nailik
çŸæç¹ã§ã¯ããã©ãã¿ãŒãæŽæ°ããŠããªããå©ããããšã¯ã§ããŸãã
ãã©ãã¿ãŒããŒã ã«ãã£ãŠå®è£
ãããä»ã®ãã©ãã¿ãŒããŒã«ïŒããšãã°devtoolsïŒããã®ãããã«ãŒã«ãããããªãã®ã¯ãªãã ãããšæããŸãã
圌ãã¯åœŒãã«ãã£ãŠãããã¯ãããå Žåã«ã®ã¿ãã°ãä¿®æ£ããŠããããã§ãã
ããã¯é倧ãªæ°æ©èœã§ã¯ãªãããã¬ãŒã ã¯ãŒã¯ãããã«ãŒã§ãã
ãããã£ãŠããã®https://github.com/flutter/flutter/issues/18761#issuecomment -639248761ã«ãããšãP3ã§ããå¿
èŠããããŸãã
ãã©ãã¿ãŒããŒã ã«ãã£ãŠå®è£ ãããä»ã®ãã©ãã¿ãŒããŒã«ïŒããšãã°devtoolsïŒããã®ãããã«ãŒã«ãããããªãã®ã¯ãªãã ãããšæããŸãã
圌ãã¯åœŒãã«ãã£ãŠãããã¯ãããå Žåã«ã®ã¿ãã°ãä¿®æ£ããŠããããã§ãã
æ£çŽãªãšããããã®åé¡ãå®éã®ã¢ããªã«äžãã圱é¿ã¯é倧è©äŸ¡ãããŠãããšæããŸãã ç©äºãç°¡åã«ãªãã®ã§ãç§ã¯ãã®åé¡ãèŠãŠããã ãã§ããããåé¿çãããããŸãã ãŸããæ¬çªç°å¢ã®å€ãã®ã¢ããªããã©ã°ã€ã³ã¯ããã¯ã°ã©ãŠã³ãæ©èœã䜿çšããŠããŸãã
ãŸãã+ 1ã®äžéšããåé¡ã®å 容ãå®å šã«ç解ããŠããªããã©ãããããããŸããã ïŒhttps://github.com/flutter/flutter/issues/13937#issuecomment-635683123ã®ããã«ïŒã Imoã¯ãããã¯ã°ã©ãŠã³ãåé¢ãšãããã¬ã¹ã©ã³ã¿ã€ã ïŒããã³ããã管çããæ¹æ³ïŒã®å ¬åŒããã¥ã¡ã³ãããŸã å°ãäžè¶³ããŠãããFirebaseã¡ãã»ãŒãžã³ã°ã®ãã®ã¯æªå€¢ã§ãããããã¯ãã¬ãŒã ã¯ãŒã¯ããšã³ãžã³ãšã¯é¢ä¿ãããŸããð€·ââïž
ãã¶ãããã©ãã¿ãŒããŒã ãããã·ã³ã°ããã®ããããŠãé©ãã¹ãé²æ©ããããããã¯åé¿ã§ããªããã®ã§ã¯ãããŸãã...ãããŠPRãããå Žåã¯ããã©ãã¿ãŒããŒã ã«ãããæåºããŠæ€èšããŠã¿ãŸãããð€
åé¢ã«å¯ŸããŠãã®åäœãå®è£ ããããšã«ã¯åé¡ããããŸãã
äŸïŒ
ã¡ã€ã³ã¢ã€ãœã¬ãŒããšãšã³ãžã³ããããŸãã
åé¢ãäœããå¿
èŠãšããå Žåãããã¯ãšã³ãžã³ã«å°ããŸãã
ãšã³ãžã³ãäœããå¿
èŠãšããå Žåãããã¯åé¢ã«å°ããŸãã
ä»ãç§ãã¡ã®ç¶æ³ã¯æ¬¡ã®ãšããã§ãã
2ã€ã®åé¢æ ªãš1ã€ã®ãšã³ãžã³ããããŸãã
åé¢ãäœããå¿
èŠãšããå Žåãããã¯ãšã³ãžã³ã«å°ããŸãã
ãšã³ãžã³ãäœããå¿
èŠãšããå Žåãããã¯äœããã¹ãã§ããïŒ
äž¡æ¹ã«èããŠã¿ãŸãããïŒ ã§ã¯ã誰ãçããã®ãïŒ
ãŸãã¯ã1ã€ã®éé¢ã ããå°ããŸããïŒ ã§ã¯ãã©ãã§ããïŒ
@hpoulããã«ããå€ãã®äººã ã¯android / iosããã°ã©ãã³ã°ã®åå¿è ã§ããã圌ãã¯ã¢ããªéçºã®ããã®æåã®ãã¬ãŒã ã¯ãŒã¯ããã©ãã¿ãŒã«ããããšãéžæããã®ã§ãç§ã¯åæããªãããšã«åæããå¿ èŠããããŸãã
ãããã£ãŠã誰ãããããèªèãããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠãããã¯ãããŠè€éãªãåé¿çããå®è¡ããããã«åŒ·å¶ããããã®çš®ã®åé¡ã®äŸã䜿çšããŠãå ¬åŒã®åé¿çãä¿®æ£ãŸãã¯ææ¡ããããšãéèŠã§ããããã®ã³ã¡ã³ããstackoverflowãä»ã®ããã°ã®ã©ãã«ãååã«èª¬æãããåé¿çããªããããã©ãããå§ããã°ããã§ããã ãããæ£ããå®è£ ããŠãããããããªãããããŠããªããããããªãããã€ãã®ããã±ãŒãžãæããŠãããã®ã ãããããŸãã
androidãšiosã®äž¡æ¹ã§ããµãŒãã¹ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãã¥ãŒãªã©ãæäœããçµéšãè±å¯ã§ããããç°¡åã«åé¿ã§ãã人ã¯ããã©ãã¿ãŒã®å¯Ÿè±¡ãšãªã人å£çµ±èšã§ã¯ãããŸããã
ãããŠããã®ãããªãããã¯ã®ã³ã¡ã³ãããå€ãããšãä»ã®ãã¹ãŠã®åé¡ã«èª€ã£ã+1ããããšç¢ºä¿¡ããŠããŸããããã¯ãåé¡ã®åªå é äœãããŸãå€æŽããããã®åé¡ã¯äŸç¶ãšããŠãããã«ãããŸãã
ããã«ã¡ã¯@phanirithvij
flutter_isolateã¯äžèšã§ãªã³ã¯ãããŠããã2019幎2æããååšããŠããŸãããããè€éã§ã¯ãããŸããã ç°¡åãããªREADMEãã³ããŒããŸãã
FlutterIsolateã䜿çšãããšãFlutterãã©ã°ã€ã³ã䜿çšã§ããFlutterã§Isolateãäœæã§ããŸãã ãã©ãããã©ãŒã ãã£ãã«ãåé¢å ã§æ©èœã§ããããã«ããããã«å¿ èŠãªãã©ãããã©ãŒã åºæã®ãããïŒAndroidã®å Žåã¯FlutterBackgroundViewãiOSã®å Žåã¯FlutterEngineïŒãäœæããŸãã
| | Android | iOS | 説æ|
| ïŒ--------------- | ïŒ----------------ïŒ| ïŒ------------------ïŒ| ïŒ-------------------------------- |
| FlutterIsolate.spawnïŒentryPointãmessageïŒ| ïŒwhite_check_markïŒ| ïŒwhite_check_markïŒ| æ°ããFlutterIsolateãçæããŸã|
| flutterIsolate.pauseïŒïŒ| ïŒwhite_check_markïŒ| ïŒwhite_check_markïŒ| å®è¡äžã®åé¢ãäžæåæ¢ããŸã|
| flutterIsolate.resumeïŒïŒ| ïŒwhite_check_markïŒ| ïŒwhite_check_markïŒ| äžæåæ¢ããisoalteãåéããŸãã|
| flutterIsolate.killïŒïŒ| ïŒwhite_check_markïŒ| ïŒwhite_check_markïŒ| åé¢æ ªã殺ã|
ãããã®ã¡ãœããã¯ãå
ã®ã Isolate
ã¯ã©ã¹ã®ã¡ãœãããšåãååã§ãããããç°¡åã«èšããŸããå
¬åŒããã¥ã¡ã³ãããåé¢ã䜿çšããæ¹æ³ããã§ã«ç¥ã£ãŠããå Žåã¯ã䜿çšæ¹æ³ãç解ããã®ã¯é£ããããšã§ã¯ãããŸãããããã¯ãå°ãªããšãäžèšã®ã¡ãœããã§ã¯ãããããã€ã³ã®ä»£æ¿ãšããŠäœ¿çšãããŸãã
ïŒæ³šïŒç§ãã以åã®ã³ã¡ã³ãã§ãã§ã«è¿°ã¹ãçç±ã§ãã®åé¡ãæ£åŒã«ä¿®æ£ããããšæããŸãããã®äžéšãããªããšå ±æããŸããããã®åé¿çããè€éããšã¯åŒã³ãŸãããïŒ
@nikitadolã®ã³ã¡ã³ãã«å¿ããŠãflutter_isolateã¯åé¢ããšã«åå¥ã®ãšã³ãžã³ãäœæãããããåãåé¡ãçºçããããšã¯ãããŸããã ãã¡ãããåé¢ããšã«æ°ãããšã³ãžã³ãäœæããå¿ èŠãããã®ã¯çæ³çã§ã¯ãããŸãããããããFlutterããŒã ãããè¯ãä»äºãããããšãã§ãããšç¢ºä¿¡ããŠããçç±ã®1ã€ã§ãã åæ§ã«ããã¹ãŠã®ãã©ã°ã€ã³ã¡ãœããåŒã³åºããã¡ã€ã³ã®åé¢ã«ãã€ããã代æ¿ãœãªã¥ãŒã·ã§ã³ã¯ãããããåé¢ã®ç®æšã«åããããã«ããã¯ãäœæãããããFlutterããŒã ããããããé©åã«å®è¡ã§ãããšç¢ºä¿¡ããŠããŸãã
FlutterããŒã ãæåã«å¯ŸåŠããåªå 床ã®é«ãåé¡ããããããããªããšèšã£ã人ãã¡ã«åæããŸããããã©ã°ã€ã³ã¢ãŒããã¯ãã£ã§ä»¥åã«èŠããã®ã«åºã¥ããŠããããä¿®æ£ããã«ã¯ã¢ãŒããã¯ãã£ã®å€§å¹ ãªå€æŽããã®ä»ã®ããã€ãã®æªè§£æ±ºã®åé¡ãå¿ èŠã«ãªãå¯èœæ§ããããŸããŸããã¢ãŒããã¯ãã£ãå€§å¹ ã«å€æŽããå¿ èŠãããããããã®ããŸããŸãªèŠä»¶ããã¹ãŠæ€èšããããšã§ããã®ç¹å®ã®åé¡ã«å¯ŸåŠã§ããããã«ãªããŸã§ã«æéããããå¯èœæ§ããããŸãã
@ryanheise
flutter_isolateã¯ãåé¢ããšã«åå¥ã®ãšã³ãžã³ãäœæããŸã
ã ãããFlutterããŒã ãããããââã£ãšããŸãããããšç¢ºä¿¡ããŠããŸãã
FlutterããŒã ã¯ãããè¡ãããšãã§ãããšããªãã¯èšããŸãããã©ããã£ãŠïŒ
äžèšã®è³ªåã¯åŒãç¶ãæå¹ã§ãã
解決çãæ°ãããšã³ãžã³ãäœæããããšã§ããå Žåã¯ããã©ã°ã€ã³ã䜿çšããã ãã§ãã
ïŒæ³šïŒflutter_isolateã¯ç§ã®ãã©ã°ã€ã³ã§ã¯ãããŸãããããã®æ©èœãå¿ èŠã ã£ãã®ã§ããããžã§ã¯ãã«è²¢ç®ããããšã«ããŸãããïŒ
ç§ããããè¯ãä»äºããšã¯ããã©ã°ã€ã³ãšéä¿¡ããããã ãã«FlutterEngineã®ãã¹ãŠã®æ©æ¢°ãèµ·åããå¿ èŠã¯ãªããšããããšã§ãããçŸæç¹ã§ã¯ãå¿ èŠãªã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ãã¹ãŠãšã³ãžã³ã«é¢é£ä»ããããŠãããããçŸåšã¯ãã®ããã§ãã flutter_isolateã¯ããã©ã°ã€ã³ã«ã¢ã¯ã»ã¹ããããã ãã«ãšã³ãžã³å šäœãèµ·åããå¿ èŠããããŸãã
ïŒæ³šïŒflutter_isolateã¯ç§ã®ãã©ã°ã€ã³ã§ã¯ãããŸãããããã®æ©èœãå¿ èŠã ã£ãã®ã§ããããžã§ã¯ãã«è²¢ç®ããããšã«ããŸãããïŒ
ç³ãèš³ãããŸããããããããã©ãŒã¯ã§ããããšã«æ°ã¥ããŸããã§ãã
flutter_isolateã¯ããã©ã°ã€ã³ã«ã¢ã¯ã»ã¹ããããã ãã«ãšã³ãžã³å šäœãèµ·åããå¿ èŠããããŸãã
'is_background_view = true'ãæå®ãããšããšã³ãžã³ã¯ã¬ã³ããªã³ã°ãéå§ããŸãããã€ãŸãããšã³ãžã³ã¯å®å šã«ã¯éå§ãããŸããã
ãããã¬ã¹ãå®è¡ããããã®æ£ç¢ºãªAPIã¯ãiOSãšAndroidv1ããã³Androidv2ã§ç°ãªããŸãããåºæ¬çã«ããã¯flutter_isolateããã§ã«è¡ã£ãŠããããšã§ãã ãã ããéåžžã®åé¢ãšFlutterEngineã®éã«ã¯ãŸã ãªãŒããŒãããã®éããããããããªãŒããŒããããããã«äžããããšã¯ãFlutterããŒã ãå®è¡ã§ããããšã ãã§ãã ããã¯ãèµ·åæã®ãªãŒããŒãããã ãã§ãªããã¡ã¢ãªäœ¿çšéã®ãªãŒããŒãããã§ããããŸãã
ã§ã¯ãããã¯ã°ã©ãŠã³ãã§åäœããããã«æ°ãããšã³ãžã³ã®äœæãæé©åããããšãææ¡ããŸããïŒ
次ã«ãããã¯ãããããã®åé¡ã«ã¯åœãŠã¯ãŸããŸãã
ç§ã¯ããã瀺åããŠããã®ã§ã¯ãªããåé¿ã§ããªããªãŒããŒãããã®ããã«ãflutter_isolateã®åé¿çã«ã¯ãã®å¶éãããããšãææããŠããã ãã§ãã FlutterããŒã ãåé¿çãããå¹ççã«ããããã«åªããã¹ãã ãšèšã£ãŠããã®ã§ã¯ãããŸãããçæ³çã«ã¯ãFlutterEngineãã€ã³ã¹ã¿ã³ã¹åããå¿ èŠããªãããã«ããã©ã°ã€ã³ã®ããŒãæ¹æ³ã«ã¢ãŒããã¯ãã£äžã®å€æŽããããšæããŸãã
ãšã³ãžã³ã1ã§ãåé¢ã1ãã倧ããå Žåã次ã®è³ªåã«æ»ããŸãã
https://github.com/flutter/flutter/issues/13937#issuecomment -667314232
ç§ã¯ãã®æ°ãã軜éã¢ãŒããã¯ãã£ã®ãœãªã¥ãŒã·ã§ã³ãå®éã«èãåºãããšã¯ããŠããŸããããããªããç§ã«å°ããŠããã®ã§ããã°ã軜éãœãªã¥ãŒã·ã§ã³ã®2ã€ã®ããªãšãŒã·ã§ã³ãèããããšãã§ããŸãã
ããªããç§ã«å°ããŠãããªã
ã¯ãããé¡ãããŸã
é©åãªåé¢ã«ã¡ãã»ãŒãžãéä¿¡ã§ããŸãã
ãé©åãªåé¢ãã¯çžââ察çãªæŠå¿µã§ãããããããã¯æªã解決çã ãšæããŸã
åãFlutterEngineå ã§ãåé¢ããšã«æ°ãããã©ã°ã€ã³ã¬ãžã¹ããªãªã©ãäœæããŸãã
ããã¯è¯ããªãã·ã§ã³ãããããŸãããããšã³ãžã³ãåžžã«ãã©ã°ã€ã³ãããèªäœã§ç»é²ããå Žåã«éããŸãã
ãã ããããã¯ãGeneratedPluginRegistrantå
ã®ãã¹ãŠã®ãã©ã°ã€ã³ã®å Žåã«ã®ã¿çºçããŸãã
https://github.com/flutter/engine/blob/f7d241fd8a889fadf8ab3f9d57918be3d986b4be/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java#L330 -L344
è¿œå ã®ã³ãŒã«ããã¯ãäœæããããšã¯æãããªåäœã§ã¯ãããŸããã
ãé©åãªåé¢ãã¯çžââ察çãªæŠå¿µã§ãããããããã¯æªã解決çã ãšæããŸã
ããã¯æªã解決çãããããŸãããããã®çç±ã§æªãããšã¯ããåŸãŸããã ãæ£ããåé¢ãã¯ããµãŒããŒãœã±ãããã¯ã©ã€ã¢ã³ãæ¥ç¶ãæ確ãªæ¹æ³ã§åŠçããã®ãšåãããã«æ確ã§ãã
ããã¯è¯ããªãã·ã§ã³ãããããŸãããããšã³ãžã³ãåžžã«ãã©ã°ã€ã³ãããèªäœã§ç»é²ããå Žåã«éããŸãã
ããã¯ãåžžã«çºçããããšãä¿èšŒããããã«è¯ãããšã§ãã çŸåšãã¡ã«ããºã ã¯å°ãäžå®å®ã§ãã
ããã¯æªã解決çãããããŸãããããã®çç±ã§æªãããšã¯ããåŸãŸããã ãæ£ããåé¢ãã¯ããµãŒããŒãœã±ãããã¯ã©ã€ã¢ã³ãæ¥ç¶ãæ確ãªæ¹æ³ã§åŠçããã®ãšåãããã«æ確ã§ãã
次ã«ãåãã©ã°ã€ã³ã¯ãç°ãªãåé¢ããã¢ã¯ã»ã¹ã§ããããšãèæ ®ã«å ¥ããå¿ èŠããããŸã-æªã
ããã
ãã®è°è«ã«ç§ã®2ã»ã³ããè¿œå ããŸããã...çŽ2幎éFlutterãšåæ¥çã«ååããŠããäžã§ãç§ãåŠãã æãéèŠãªããšã¯ã FlutterãUIããŒã«ãããã§ããããšã§ããã 人ã ããããå¿ããŠããªããã°ããã®å£°æã«ã¯é©ãã¹ãããšã¯äœããããŸãã-ããã¯ã¡ã€ã³ã®FlutterãŠã§ããµã€ãã§ããããèšã£ãŠããŸã-ã
Flutterã¯UIããŒã«ãããã§ããããããããŸãæ©èœããã®ã¯UIã§ãã é«äŸ¡ãªããŒã¿åŠçã«äŸåããããŸãã¯è€éãªã¢ã«ãŽãªãºã ã䜿çšãã倧éã®ããŒã¿ãæ¶è²»ããCPUè² è·ã®é«ãã¢ããªã±ãŒã·ã§ã³ãäœæããããšããŠããå Žåã¯ããã®ç®çã§UIããŒã«ãããã䜿çšããªãã§ãã ããã ããžãã¹ããžãã¯ãUIãšæ··åšãããªãã§ãã ããã
ãã¡ãããDartã䜿çšãããšãUIã ãã§ãªãããã以äžã®ããšãã§ããŸããããã®ããŒã«ãããã®äž»ãªç®çãå¿ããªãã§ãã ããã
ãããã¬ã¹ãã©ãã¿ãŒã䜿çšãããªã©ãããŸããŸãªã¢ãããŒããè©ŠããŸããããããã¯å®å šãªçœå®³ã§ããããšãå€æããŸããã ãããæ©èœããªãããã§ã¯ãªããä»ã®éçºè ã«ãããã©ã®ããã«æ©èœãããã説æããã®ã«åé¡ãããããã§ãã ãããåèšããã¡ã³ããã³ã¹è² æ ã¯ãããã ãã®äŸ¡å€ããããŸããã ãã®ãããªãœãªã¥ãŒã·ã§ã³ã®ãã¹ãã«ã€ããŠãèšåããªãã§ãã ããã ååè©ŠãããšããFlutterDriverã¯ããããŸã£ããåŠçããŸããã§ããã
ã¢ããªã±ãŒã·ã§ã³ãæ¬åœã«åŠçèœåãå¿ èŠãšããå ŽåãIMHOã«ã¯ã次ã®3ã€ã®ãªãã·ã§ã³ããããŸãã
äžèšã®ãã¹ãŠã«æ¬ ç¹ããããŸãããã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ãæ¡åŒµããŠãå®éã«ã¯èšèšãããŠããªãããšãå®è¡ããããšããããšãçæ³çã§ã¯ãããŸããã
Isolate_handlerã¯ãã®åé¡ã解決ããŸããã§ãããïŒ
@hasonguoããã¯ã°ã©ãŠã³ãã§flutter_isolate
ã䜿çšããŸããéä¿¡çšã®ãã€ã©ãŒãã¬ãŒããè¿œå ããããšã§ãåé¢ïŒå®éã«ã¯ä»»æã®åé¢ïŒã®åŠçã容æã«ããè¿œå ã®ã¬ã€ã€ãŒãè¿œå ããã ããªã®ã§ãæ¯åæåã§èšå®ããå¿
èŠã¯ãããŸãããæéã 以åã¯å¥ã®æ¹æ³ã§åé¡ã«å¯ŸåŠããŠããŸããããFlutterèªäœã®å€æŽã«ãã£ãŠäžå¯èœã«ãªãã代ããã«flutter_isolate
ã«äŸåããããã«å€æŽãããŸããã
ç§ãã¡ã¯èŒªã«ãªã£ãŠè¡ããŸãã ã¯ãã解決çããããŸããå®éã«ã¯äž¡æ¹ã®ãã©ã°ã€ã³ã§ãã ã©ã€ã¢ã³ãææããããã«ããã£ãã«éä¿¡ãå¯èœã«ããããšã«ã¯ãªãŒããŒãããã䌎ããŸãã å€ãã®å ŽåïŒã»ãšãã©ã®å ŽåïŒããµããŒããå¿
èŠãªããããFlutterããŒã ãå
ã®Isolate
ã«èªåçã«è¿œå ããããšãåé¿ããã®ã¯ãŸãã«ãã®ãªãŒããŒãããã§ãã
ããã§ããããã¯ãããåŸãããšãã§ããã»ã©ããããªè§£æ±ºçã§ã¯ãããŸããã FlutterããŒã ãããªãŒããŒããããªãã§ãçŽæ¥ãã€èªåçã«ãåºæ¬çãªIsolate
ã䜿çšããŠãç®±ããåºããŠããã«ãã£ãã«éä¿¡ãæäŸã§ãããšããããè°è«å
šäœã¯è°è«ã®äœå°ããããŸãã ãã ãããã®éãåœãŠã¯ãŸããŸããã€ãŸããå€æŽã®ããã«å®éã«å€æŽãè¿œæ±ããŠããããã§ã¯ãããŸããã ããã±ãŒãžãŸãã¯ãã©ã°ã€ã³ã«å®è¡å¯èœãªãœãªã¥ãŒã·ã§ã³ãããå ŽåããªãæéããããŠã³ã¢ã«éã¿ãå ããã®ã§ããïŒ
åãFlutterEngineå ã§ãåé¢ããšã«æ°ãããã©ã°ã€ã³ã¬ãžã¹ããªãªã©ãäœæããŸãã
ããã¯è¯ããªãã·ã§ã³ãããããŸãããããšã³ãžã³ãåžžã«ãã©ã°ã€ã³ãããèªäœã§ç»é²ããå Žåã«éããŸãã
ãã ããããã¯ãGeneratedPluginRegistrantå ã®ãã¹ãŠã®ãã©ã°ã€ã³ã®å Žåã«ã®ã¿çºçããŸãã
https://github.com/flutter/engine/blob/f7d241fd8a889fadf8ab3f9d57918be3d986b4be/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java#L330 -L344è¿œå ã®ã³ãŒã«ããã¯ãäœæããããšã¯æãããªåäœã§ã¯ãããŸããã
ãã®2çªç®ã®ã¢ã€ãã¢ã®ãã1ã€ã®æ¹åç¹ã¯ããã©ã°ã€ã³ãæ°ããåé¢ã§é
延ããŒãããããšã§ãã éåžžããããžã§ã¯ããå€ãã®ãã©ã°ã€ã³ã«äŸåããŠããå Žåã GeneratedPluginRegistrant
ã¯éåžžã«å€§ãããªãããã©ã°ã€ã³ã®åæåã«ãŒãã³ã®å¹çã«ãã£ãŠã¯ãããããªãŒããŒãããã®äžéšã«å¯äžããå¯èœæ§ããããŸãã æ£ç¢ºã«ãããå®è£
ããæ¹æ³ã¯å¥ã®è©±ã§ãã ãã©ãããã©ãŒã ãã£ãã«ã¯ãã©ã°ã€ã³ã«ãã£ãŠææãããŠããªããããçŸåšããã£ãã«ãä»ããŠã¡ãã»ãŒãžãéä¿¡ããããšã䜿çšããŠããã©ã°ã€ã³ã®ãã©ãããã©ãŒã åŽãã€ã³ã¹ã¿ã³ã¹åããããšã¯ã§ããŸããã ãããã£ãŠãã¡ãœãããã£ãã«ããã©ã°ã€ã³ã«é¢é£ä»ãããããã©ã°ã€ã³ã®DartåŽãæåã®ã¡ãœãããã£ãã«ãäœæãããåã«ããèªäœãé
延çã«åæåããããã«åŒã³åºãããšãã§ããè¿œå ã®ã¡ã«ããºã ãå¿
èŠã§ããããã®ã¡ã«ããºã ãã€ã³ã¹ã¿ã³ã¹åãããªã¬ãŒããå¯èœæ§ããããŸãåé¢å
ã®ãã®ãã©ã°ã€ã³ã®ãã©ãããã©ãŒã åŽã®ã
@TahaTesser
ããªãã®äŸã§ã¯ããšã©ãŒã¯ãã®åé¡ãšã¯é¢ä¿ãããŸãã
E/flutter ( 7814): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: Invalid argument(s): Isolate.spawn expects to be passed a static or top-level function
ããã«ã¡ã¯@nikitadol
ãããã§ãæŽæ°ãããäŸãããã¯äŸå€ãã¹ããŒããŸãããããã¯æ£ããã§ããïŒ ïŒä»¥åã¯äœ¿çšããå¿
èŠããããŸããã§ããïŒ
å®å
šã«åçŸå¯èœãªæå°éã®ã³ãŒããµã³ãã«ãæäŸããŠããã ããŸãã
ããããšã
@TahaTesserã³ãŒããµã³ãã«
import 'package:battery/battery.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
Future<void> main() async {
await printBatteryLevel();
await compute(printBatteryLevel, null);
}
Future<void> printBatteryLevel([dynamic message]) async {
WidgetsFlutterBinding.ensureInitialized();
print(await Battery().batteryLevel);
}
ãã°
Launching lib/main.dart on Pixel 4 in debug mode...
Running Gradle task 'assembleDebug'...
â Built build/app/outputs/flutter-apk/app-debug.apk.
Installing build/app/outputs/flutter-apk/app.apk...
Waiting for Pixel 4 to report its views...
Debug service listening on ws://127.0.0.1:50709/-SPs_6AmL2Q=/ws
Syncing files to device Pixel 4...
I/flutter ( 8708): 39
E/flutter ( 8708): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Exception: UI actions are only available on root isolate.
E/flutter ( 8708): #0 Window._nativeSetNeedsReportTimings (dart:ui/window.dart:1003:86)
E/flutter ( 8708): #1 Window.onReportTimings= (dart:ui/window.dart:996:29)
E/flutter ( 8708): #2 SchedulerBinding.addTimingsCallback (package:flutter/src/scheduler/binding.dart:272:14)
E/flutter ( 8708): #3 SchedulerBinding.initInstances (package:flutter/src/scheduler/binding.dart:209:7)
E/flutter ( 8708): #4 ServicesBinding.initInstances (package:flutter/src/services/binding.dart:27:11)
E/flutter ( 8708): #5 PaintingBinding.initInstances (package:flutter/src/painting/binding.dart:23:11)
E/flutter ( 8708): #6 SemanticsBinding.initInstances (package:flutter/src/semantics/binding.dart:24:11)
E/flutter ( 8708): #7 RendererBinding.initInstances (package:flutter/src/rendering/binding.dart:32:11)
E/flutter ( 8708): #8 WidgetsBinding.initInstances (package:flutter/src/widgets/binding.dart:257:11)
E/flutter ( 8708): #9 new BindingBase (package:flutter/src/foundation/binding.dart:59:5)
E/flutter ( 8708): #10 new _WidgetsFlutterBinding&BindingBase&GestureBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #11 new _WidgetsFlutterBinding&BindingBase&GestureBinding&SchedulerBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #12 new _WidgetsFlutterBinding&BindingBase&GestureBinding&SchedulerBinding&ServicesBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #13 new _WidgetsFlutterBinding&BindingBase&GestureBinding&SchedulerBinding&ServicesBinding&PaintingBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #14 new _WidgetsFlutterBinding&BindingBase&GestureBinding&SchedulerBinding&ServicesBinding&PaintingBinding&SemanticsBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #15 new _WidgetsFlutterBinding&BindingBase&GestureBinding&SchedulerBinding&ServicesBinding&PaintingBinding&SemanticsBinding&RendererBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #16 new _WidgetsFlutterBinding&BindingBase&GestureBinding&SchedulerBinding&ServicesBinding&PaintingBinding&SemanticsBinding&RendererBinding&WidgetsBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #17 new WidgetsFlutterBinding (package:flutter/src/widgets/binding.dart)
E/flutter ( 8708): #18 WidgetsFlutterBinding.ensureInitialized (package:flutter/src/widgets/binding.dart:1229:7)
E/flutter ( 8708): #19 printBatteryLevel (package:bug/main.dart:11:25)
E/flutter ( 8708): #20 _IsolateConfiguration.apply (package:flutter/src/foundation/_isolates_io.dart:83:34)
E/flutter ( 8708): #21 _spawn.<anonymous closure> (package:flutter/src/foundation/_isolates_io.dart:90:65)
E/flutter ( 8708): #22 Timeline.timeSync (dart:developer/timeline.dart:163:22)
E/flutter ( 8708): #23 _spawn (package:flutter/src/foundation/_isolates_io.dart:87:35)
E/flutter ( 8708): #24 _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:304:17)
E/flutter ( 8708): #25 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter ( 8708):
ãã©ãã¿ãŒãã¯ã¿ãŒ-v
[â] Flutter (Channel stable, 1.20.4, on Mac OS X 10.15.6 19G2021, locale en-BY)
⢠Flutter version 1.20.4 at /Users/nikitadold/development/flutter
⢠Framework revision fba99f6cf9 (2 weeks ago), 2020-09-14 15:32:52 -0700
⢠Engine revision d1bc06f032
⢠Dart version 2.9.2
[â] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
⢠Android SDK at /Users/nikitadold/Library/Android/sdk
⢠Platform android-30, build-tools 30.0.0
⢠Java binary at: /Users/nikitadold/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/193.6626763/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
⢠Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
⢠All Android licenses accepted.
[â] Xcode - develop for iOS and macOS (Xcode 12.0.1)
⢠Xcode at /Applications/Xcode.app/Contents/Developer
⢠Xcode 12.0.1, Build version 12A7300
⢠CocoaPods version 1.9.3
[!] Android Studio (version 4.0)
⢠Android Studio at /Users/nikitadold/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/193.6626763/Android Studio.app/Contents
â Flutter plugin not installed; this adds Flutter specific functionality.
â Dart plugin not installed; this adds Dart specific functionality.
⢠Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593)
[â] IntelliJ IDEA Ultimate Edition (version 2020.2.2)
⢠IntelliJ at /Users/nikitadold/Applications/JetBrains Toolbox/IntelliJ IDEA Ultimate.app
⢠Flutter plugin installed
⢠Dart plugin version 202.7319.5
@TahaTesser
ãã®ã³ã¡ã³ããã芧ãã ãã
ãã©ãããã©ãŒã ã¡ãã»ãŒãžã¯ãã¡ã€ã³ã®åé¢ããã®ã¿ãµããŒããããŸãã [...]
ãã®åäœã¯_æåŸ
_ã§ãããã©ãã«severe: new feature
ãããŸã
ãã®åé¡ã¯ã _bug_ã§ã¯ãªã_featurerequest_ãŸãã¯_proposition_ãšèŠãªãå¿
èŠããããŸã
@iapicca
ããªãã®äŸã§ã¯ããšã©ãŒã¯ãã®åé¡ãšã¯é¢ä¿ãããŸãã
E/flutter (23174): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Invalid argument(s): Illegal argument in isolate message : (object is a closure - Function '<anonymous closure>':.)
@iapicca
ããªãã®äŸã§ã¯ããšã©ãŒã¯ãã®åé¡ãšã¯é¢ä¿ãããŸãã
E/flutter (23174): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Invalid argument(s): Illegal argument in isolate message : (object is a closure - Function '<anonymous closure>':.)
ããªãã¯æ£ããã§ãç§ã®ãã®ã¯è¯ãäŸã§ã¯ãããŸããããããç¡èŠããŠãã ãã
æãåèã«ãªãã³ã¡ã³ã
ããŸããŸãªãŠãŒã¹ã±ãŒã¹ããããŸããäŸïŒ
äžè¬ã«ãäŸåé¢ä¿ã䜿çšããŠãæçµçã«ãã©ãããã©ãŒã åºæã®ã³ãŒãã䜿çšããŠãããã®åŠçãå®è¡ãããã©ãããå®éã«ã¯ããããªãããã€ãã®ãããªãã¯ã¡ãœããã宣èšããããšããããŸãïŒããšãã°ããã©ãã¿ãŒãã¡ã€ã¢ã«ã€ããŠèããŠããŸãïŒã ãããã䜿çšããimhoã¯ãç³ã§æžããããã®ã§ã¯ãªããæéãšãšãã«å€åããå¯èœæ§ã®ããå®è£ ã®è©³çŽ°ã§ããå¿ èŠããããŸãã
ããŒã¿ã¯ã¡ãœãããã£ãã«ã«æž¡ãããæ¹æ³ã§ãã§ã«ãšã³ã³ãŒããããŠãããããåé¿çã¯ä»ã®ãšããåé¡ãªããå®è£ ããã®ã¯æ¯èŒçç°¡åã§ãããã®ãããåé¢ããŒããä»ããŠãç°¡åã«æž¡ãããŸãããããã©ãŒãã³ã¹ã¯æé©ã§ã¯ãªããšæããŸãã ã
ãã ããå®è£ äžã«å°ãè¡ãè©°ãŸããŸãããã¡ã€ã³ã®åé¢ã¡ãœãããã»ã«ã³ããªã®åé¢ã¡ãœããããéçã¡ãœãããåŒã³åºãç°¡åãªæ¹æ³ã®äŸãæããŠãã ããã
ããããšã