ãã¡ãããnull-safetyã¯èšèªéçºã®éèŠãªã¹ãããã§ããDartããŒã ã¯ãnull-safetyããŒãžã§ã³ã®ããŒã¿ãªãªãŒã¹ãçºè¡šããŸããïŒãã®ãªãªãŒã¹ã«é¢ãããã¥ãŒã¹ããã·ã¢èªã«ç¿»èš³ããŸããããã®ãã¥ãŒã¹ã§ã¯ãæ°ããããŒãžã§ã³ã«ç§»è¡ããæ¹æ³ãåŸãããã¡ãªããããããŠç§ãã¡å šå¡ã«ãšã£ãŠã®null-safetyã®ã¡ãªããã«ã€ããŠåŠã³ãŸãã
æ¬æ¥ãDartãšFlutterã§ä¿¡é Œæ§ã®é«ãnull-safetyããŒã¿çãå©çšå¯èœã«ãªã£ãããšãçºè¡šããŸããããã«ã»ãŒããã£ã¯ãæ€åºãå°é£ãªããšãå€ããã°ã®ã¯ã©ã¹ã§ãããã«åç §ãã°ãåé¿ããããã®ææ°ã®äž»èŠãªé²æ©ã§ãããã®ãããªã§ã¯ãç§ãã¡ã®åã³ã®çç±ãäžè¬çã«èª¬æããŠããŸãã
null-safetyããŒã¿çãžã®ç§»è¡ã«äŒŽããpub.devã§å©çšå¯èœãªäœåãã®ããã±ãŒãžãç§»è¡ããæãæ¥ãŸãããDartã³ã¢ã©ã€ãã©ãªãFlutterãã¬ãŒã ã¯ãŒã¯ãããã³40ãè¶ ããDartããã³Flutterããã±ãŒãžãç§»æ€ããŸãããããã¯èšã£ãŠããã³ãã¥ããã£ãããã±ãŒãžãç§»è¡ããããšã§null-safetyãåãå ¥ããããšãé¡ã£ãŠããŸãã
ããŒã¿ãªãªãŒã¹ã§ã¯ãnull-safetyå®å®çãªãªãŒã¹ããªãªãŒã¹ãããåã«ããŒã ã¹ãã¬ããã«å ¥ããŸãããã®æ©èœããå©çšããã ããæ¹åããŠUIã¡ãã»ãŒãžãšããã¥ã¡ã³ããããæç¢ºã«ããããšãã§ãããã©ããããç¥ãããã ãããçæ§ããã®ãã£ãŒãããã¯ããåŸ ã¡ããŠãããŸãã
null-safetyã®éžæ
null-safetyãžã®ç§»è¡ã«ã€ããŠèª¬æããåã«ãïŒnull-safetyã¬ã€ãã©ã€ã³ã«èšèŒãããŠããããã«ïŒç§»è¡ããã€éå§ããããæ£ç¢ºã«éžæã§ããããšãç¹°ãè¿ãè¿°ã¹ãŠãããŸããã¢ããªãšããã±ãŒãžã¯ãDartSDKã®æå°å¶éãå°ãªããšãDart2.12ã®ãã¬ãªãªãŒã¹ããŒãžã§ã³ã§ããå Žåã«ã®ã¿ãnull-safetyã§æ©èœããŸãã
environment:
sdk: ">=2.12.0-0 <3.0.0"
詊ããŠã¿ãã«ã¯ã
dart create以äžã«ç€ºãã³ãŒããå«ãå°ããªnull-safety helloã¢ããªïŒããšãã°ãã䜿çšïŒãäœæããŠã¿ãŠãã ãããæ¬¡ã«ãSDKå¶éã倿ŽããååŸã«ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŠèµ·ådart pub getããããã°ã©ã ã®åäœãã©ã®ããã«å€åãããã確èªã§ããŸããïŒå¿
ãdart --version2.12ãæ£ç¢ºã«è¿éããŠãã ããïŒã
bin/hello.dart:
...
void main() {
var hello = 'Hello Dart developers';
if (someCondition) {
hello = null;
}
print(hello);
}
Before changing the SDK constraint:
$ dart run
null
After changing the SDK constraint (and running dart pub get):
$ dart run
bin/hello.dart:6:13: Error: Null can't be assigned to a variable of
type 'String' because 'String' is not nullable.
hello = null;
^
null-safetyãžã®ç§»è¡
ããã±ãŒãžïŒãŸãã¯åçŽãªã¢ããªã±ãŒã·ã§ã³ïŒãnull-safetyã¢ãŒãã«ç§»è¡ããã«ã¯ãdart.devç§»è¡ã¬ã€ãã§è©³ãã説æãããŠããæ¬¡ã®5ã€ã®æé ã«åŸããŸãã
ã¹ããã1ïŒäŸåé¢ä¿ã®æºåãã§ããŠãããã©ããã確èªãã
äŸåé¢ä¿ã°ã©ãã®ãèãããå§ããŠãã³ãŒããé çªã«ç§»åããããšã匷ããå§ãããŸããããšãã°ãCãAã«äŸåããBã«äŸåããŠããå Žåãæåã«null-safety Aã«ç§»è¡ããæ¬¡ã«Bãæ¬¡ã«Cã«ç§»è¡ããŸãããã®é åºã¯ãAãBãããã³Cãã©ã€ãã©ãªãããã±ãŒãžããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ãããã§ãããã«é¢ä¿ãªãé©çšãããŸãã
ãªãé åºãããã»ã©éèŠãªã®ã§ããïŒäŸåé¢ä¿ãç§»è¡ããåã«ã³ãŒãã®ç§»è¡ãããçšåºŠé²ããããšã¯ã§ããŸãããç§»è¡äžã«äŸåé¢ä¿ã«ãã£ãŠã€ã³ã¿ãŒãã§ã€ã¹ã倿Žãããå Žåã¯ãåå®è¡ããªããã°ãªããªããªã¹ã¯ããããŸããäžéšã®äŸåé¢ä¿ãnullã»ãŒãã§ãªãå Žåã¯ãpub.devã®åããã±ãŒãžã«ãªã¹ããããŠããé£çµ¡å ã®è©³çްã䜿çšããŠããã±ãŒãžçºè¡è ã«é£çµ¡ããããšãæ€èšããŠãã ããã
äŸåé¢ä¿ã®æºåãã§ããŠãããã©ããã®ç¢ºèª
ã¢ããªã±ãŒã·ã§ã³ãŸãã¯ããã±ãŒãžãç§»è¡ãéå§ããæºåãã§ããŠãããã©ããã確èªããã«
dart pub outdatedã¯ãnull-safetyã¢ãŒãã§å®è¡ã§ããŸããã¢ããªã±ãŒã·ã§ã³ã¯ãããããã®äŸåé¢ä¿ãæŽæ°ããå Žåã«ç§»è¡ããæºåãã§ããŠããããšã瀺ã以äžã®äŸpathãprocessããã³pedanticã«èšèŒãããŠãããã¬ãªãªãŒã¹çã«è§£æ±ºå¯èœã³ã©ã ã
æ°ãããã€ããŒããŒãžã§ã³ã§null-safetyãµããŒããå©çšã§ããå Žåã¯ã[ã¢ããã°ã¬ãŒãå¯èœ]åã«è¡šç€ºãããŸãããã«ã»ãŒããã£ã®ãµããŒãã¯ãå€ãã®å Žåãã¡ãžã£ãŒãªæ°ãããªãªãŒã¹ã§å©çšå¯èœã«ãªããŸãããã®å Žåãå€ããŠãŒãã£ãªãã£ã®åºåã®ã解決å¯èœãã»ã¯ã·ã§ã³ã«ãªã¹ããããŠããããŒãžã§ã³ã衚瀺ãããŸãããããã«åãæ¿ããã«ã¯ããã¡ã€ã«
pubspec.yamlãç·šéããŠãããã®ã¡ãžã£ãŒããŒãžã§ã³ãèš±å¯ããŸããããšãã°ãããªãã倿Žããããšãã§ããŸã
process: ^3.0.13ã«process: ^4.0.0-nullsafetyã
ããã±ãŒãžããŒãžã® æ°ããNullå®å šã¿ã°ïŒã³ã¬ã¯ã·ã§ã³1.15ãªã©ïŒãšæ°ããé«åºŠãªnullå®å šæ€çŽ¢ãªãã·ã§ã³ ã䜿çšããŠãpub.devã§nullå®å šããµããŒãããããã±ãŒãžãèŠã€ããããšãã§ããŸãã
ã¹ããã2ïŒç§»è¡ããŒã«ã䜿çšããŠè»¢éãã
äŸåé¢ä¿ã®æºåãã§ããããç§»è¡ããŒã«ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãŸãã¯ããã±ãŒãžã®ç§»è¡ãéå§ã§ããŸã
dart migrateã
ç§»è¡ããŒã«ã¯ã€ã³ã¿ã©ã¯ãã£ãã§ããããããã®ããŒã«ã«ãã£ãŠæšæž¬ãããnull-safetyããããã£ã衚瀺ã§ããŸããããŒã«ã®çµæã«åæã§ããªãå Žåã¯ãnullãã³ãã远å ããŠå€æŽã§ããŸããããã€ãã®ãã³ãã远å ããã ãã§ãç§»è¡ã®å質ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸãã
äœäººãã®Dartããã±ãŒãžäœæè ã¯ãåæã®ãã«ãåã®null-safetyãã«ãã䜿çšããŠç§»è¡ããã¹ãããŠããã圌ãã®ãã£ãŒãããã¯ã¯å¿åŒ·ããã®ã§ããç§»è¡ã¬ã€ãã«ã¯ãç§»è¡ããŒã«ã䜿çšããããã®è¿œå ã®ãã³ãããããŸãã
ã¹ããã3ïŒç§»æ€ãããã³ãŒãã®éçåæ
IDEãŸãã¯ã³ãã³ãã©ã€ã³ã§pubgetã䜿çšããŠããã±ãŒãžãæŽæ°ããŸããæ¬¡ã«ãIDEãŸãã¯ã³ãã³ãã©ã€ã³ã䜿çšããŠãDartã³ãŒãã®éçåæãå®è¡ããŸãã
$ dart pub get
$ dart analyze
ãŸãã¯ãã©ãã¿ãŒã³ãŒãïŒ
$ flutter pub get
$ flutter analyze
ã¹ããã4ïŒãã¹ãã«åæ Œããããšã確èªããŸã
ãã¹ããå®è¡ããå®å šã«åæ Œããããšã確èªããŸããnullå€ãèš±å¯ããªãããã«ããã±ãŒãžã³ãŒãã倿Žããå Žåã¯ãnullãäºæãããã¹ããæŽæ°ããå¿ èŠãããå ŽåããããŸãã
ã¹ããã5ïŒnull-safetyããã±ãŒãžãå ¬éãã
ç§»è¡ãå®äºããŠãã¹ããå®è¡ããåŸãããã±ãŒãžããã¬ãªãªãŒã¹ãšããŠå ¬éã§ããŸãããã¹ããã©ã¯ãã£ã¹ã®æŠèŠã¯æ¬¡ã®ãšããã§ãã
- ïŒäŸãã°ãããæ¬¡ã®ã¡ãžã£ãŒããŒãžã§ã³ãžã®ããŒãžã§ã³ãã¢ããã°ã¬ãŒã
2.3.xããŸã3.0.0ïŒãããã«ãããããã±ãŒãžã®ãŠãŒã¶ãŒã¯ãnull-safetyã䜿çšããæºåãã§ãããŸã§ããã±ãŒãžã«ã¢ããã°ã¬ãŒãããŸãããããã«ãããAPIããªãã¡ã¯ã¿ãªã³ã°ããŠãnull-safetyãæå€§éã«æŽ»çšããããšãã§ããŸãã - ããã±ãŒãžã翻蚳ããŠãpub.devã§ãã¬ãã¥ãŒãšããŠå
¬éããŸããïŒããšãã°ãã§ã¯
3.0.0-nullsafety.0ãªãã䜿çšããŸã3.0.0ãïŒ
ç§»è¡ãšããŒãžã§ã³ç®¡çã®è©³çްã«ã€ããŠã¯ãç§»è¡ã¬ã€ããåç §ããŠãã ããã
ä¿èšŒããããã«ã»ãŒããã£ã®å©ç¹
DartãšFlutter ã§ã®null-safetyãã¯ãã«ã«ãã¬ãã¥ãŒã«é¢ãã以åã®æçš¿ã§ã¯ãããã€ãã®äŸã䜿çšããŠãããã®å€æŽã®å©ç¹ã«ã€ããŠèª¬æããŸãããnull-safetyã宿ã«è¿ã¥ããŠããä»ããã®å©ç¹ã®å®äŸãããã€ãèŠãããŸãã
ããå®å šãªã³ãŒã
æè¿ãã¡ã€ã³ã®Flutterãã©ã³ãã«ãã°ãããã
flutterç¹å®ã®ãã·ã³æ§æã§ããŸããŸãªããŒã«ã³ãã³ããnullïŒerrorã§ã¯ã©ãã·ã¥ããããšãããããŸããThe method '>=' was called on nullãäž»ãªåé¡ã¯ãAndroid Studio4.1æ€åºã®ãµããŒãã远å ããããã®æè¿ã®ãã«ãªã¯ãšã¹ãã§ããããã®ãã«ãªã¯ãšã¹ãã¯ã次ã®ãããªã³ãŒãã远å ããŸããã
final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
/// plugin path of Android Studio changed after version 4.1.
if (major >= 4 && minor >= 1) {
...
ãã°ãèŠã€ããããšãã§ããŸããïŒããŒãžã§ã³ã¯nullã«ãªãå¯èœæ§ããããããã¡ãžã£ãŒããŒãžã§ã³ãšãã€ããŒããŒãžã§ã³ã®äž¡æ¹ãnullã«ãªãå¯èœæ§ããããŸãããã®ãã°ã¯ãããã§åç¬ã§èŠã€ããã®ã¯ç°¡åã«æãããããããŸããããå®éã«ã¯ãFlutterãªããžããªã§äœ¿çšãããå³å¯ãªã³ãŒãã¬ãã¥ãŒããã»ã¹ã䜿çšããŠãããã®çš®ã®ã³ãŒãã¯åžžã«ããæããŸãããã«ã»å®å šã§ãéçè§£æã¯ããã®åé¡ããã£ããããããã«ïŒ
ããã¯ããªãåçŽãªèª€ãã§ããã Googleã®å éšã³ãŒãã§null-safetyã䜿çšããŠããåæã®é ãããè€éãªãã°ãæ€åºãããnull-safetyã䜿çšããŠè§£æ±ºãããããšãããããŸãããããã§ã¯ããã€ãã®äŸã瀺ããŸãã
- , null , null-safety null. , protobuf, , , null. , , - null .
- Google Pay Flutter, - Flutter
StateWidget. null-safety null ; null-safety , null, . - Flutter , - Flutter , null
sceneWindow.render(). null-safety , Scene , , null.
null-safety
Dartã®null-safetyã®ä¿¡é Œæ§ãéèŠã§ããDartã³ã³ãã€ã©ã¯null-safetyæ å ±ãå©çšã§ããŸããããã¯ããªãã®ããã°ã©ã ãããå°ãããããŠããéãããããšãã§ããŸãããããŸã§ã®ãšãããnull-safetyã«å®å šã«å€æãããå®éã®ã¢ããªã±ãŒã·ã§ã³ã¯å€ããããŸããïŒçµå±ã®ãšããããããã®ã¢ããªã±ãŒã·ã§ã³ãä¿¡é Œæ§ãäŸåããããã±ãŒãžã®ãšã³ã·ã¹ãã ãç§»è¡ãå§ããã°ããã§ãïŒããã¡ã€ã³ãã¬ãŒã ã¯ãŒã¯ããéåžžã«ææãªçµæãåŸãããŠããŸãã
æè¿ãhello_worldãµã³ãã«ã®ãã¹ãåã³ã³ãã€ã«ãå®è¡ããŠãã¢ããªã±ãŒã·ã§ã³ãµã€ãºã«å¯Ÿããnull-safetyã®åœ±é¿ã枬å®ããŸãããããã¯ããhelloworldãã衚瀺ããã ãã®æå°éã®äŸã§ããæ¯èŒãããšãã³ã³ãã€ã«ãããã³ãŒãã®åèšãµã€ãºã®ãã¡ãå§çž®ãããŠããªãïŒããã€ã¹ã«ã€ã³ã¹ããŒã«ãããïŒã³ãŒãã®ãµã€ãºã¯ãä¿¡é Œã§ããnull-safetyã䜿çšããåã³ã³ãã€ã«ä»¥å€ã®ã¢ã¯ã·ã§ã³ãªãã§ã3.5ïŒ åæžãããŸãããããã¯ãå«ãŸããŠãããã¹ãŠã®ã©ã€ãã©ãªã®ã³ãŒããµã€ãºãåæžããããããã¢ããªã±ãŒã·ã§ã³å šäœã10è¡ã®ã³ãŒãã§æ§æãããŠããã«ããããããå¯èœã§ãããããšãã°ãFlutterïŒ
package:flutterïŒãã¬ãŒã ã¯ãŒã¯èªäœã¯3.9ïŒ
çž®å°ããŠããŸãã
ã³ãŒãé床ã®èгç¹ãããä¿¡é Œã§ããããŒã¿ã¿ã€ãã®ã·ã¹ãã ãé©çšããå¿ èŠããããšããªãŒããŒããããå¢å ããå¯èœæ§ããããŸãããã ããnullãã§ãã¯ãå°ãªããšãã³ãŒããé«éåãããå¯èœæ§ããããŸãããã³ãããŒã¯ã®åæåæã§ã¯ãããã©ãŒãã³ã¹ã以åã®ãªãªãŒã¹ãšåçã§ããããšã瀺ãããæ°ãã远å ã®ã¿ã€ãæ å ±ã«ãããå°æ¥çã«ããã©ãŒãã³ã¹ãåäžãããæ°ããæ¹æ³ã®å¯èœæ§ãåŸãããŸããããã«ã€ããŠã¯ãä»åŸã®åºçç©ã§è©³ãã説æããäºå®ã§ãã
å Žåã«ãã£ãŠã¯ãç§»è¡ã«ãã£ãŠã³ãŒãã®ããžãã¯ã«æ¬ é¥ãèŠã€ãã£ããšãã«ãnullã®å®å šæ§ãããã©ãŒãã³ã¹ã®åäžã«ã©ã®ããã«ã€ãªãããããã§ã«èŠãŠããŸãããããšãã°ãFlutterWebã®ããã¹ãé 眮ãã£ãã·ã¥ã«åé¡ãèŠã€ãããŸããããã®ãã£ãã·ã¥ã¯nullå¯èœãªããŒã䜿çšããæ¬¡ã«ãæå®ãããããžãã¯ã«åŸã£ãŠã䜿çšãããŸãã
TextAlign.startnullã®å Žåããã®ããžãã¯ã«ãããã¢ã€ãã ããŸã ããã©ã«ãå€ã§ããã«ãããããããã¢ã€ãã ã倿Žãããããã«èŠãããã£ãã·ã¥ãšã©ãŒãçºçããŠããŸããããã®çµæããã£ãã·ã¥ãžã®éçç£çãªåŒã³åºããé »ç¹ã«çºçããŸãããtextAlignnullãèš±å¯ããªãgetterã远å ãããšããšã©ãŒãã£ãã·ã¥ãä¿®æ£ããã®ã«åœ¹ç«ã¡ããã£ãã·ã¥ãããããã¹ãã®å Žåã«ããã¹ãã®ã¬ã³ããªã³ã°ããã©ãŒãã³ã¹ã14ååäžããŸãã
仿¥ããå§ããŸãããïŒ
null-safetyãå«ãDartãšFlutterã®ããŒã¿çã®æºåãæŽããŸãããããªãããã©ãã¿ãŒã«èšè¿°ããŠããå ŽåãããªããããŒã¿çã«åãæ¿ããããšãã§ã
flutter channel betaããã®åŸflutter upgradeããŸããFlutterã䜿çšããŠããªãå Žåã¯ãDartSDKã¢ãŒã«ã€ãããã¹ã¿ã³ãã¢ãã³ã®DartSDKãå
¥æã§ããŸãã
ããã±ãŒãžãéçºããŠããå Žåã¯ãç§»è¡ã¬ã€ããèªãã§ç§»è¡ãèšç»ããããšããå§ãããŸããåé¡ãææ¡ãããã°ãç¥ãããã ããã
ã¢ããªéçºè ã®å Žåã¯ãæ©èœãå®å®çãªãªãŒã¹ã«å°çãããŸã§ç§»æ€ãå»¶æã§ããŸããããŒã¿çã®ãã£ãŒãããã¯ã«è¿ éã«å¯Ÿå¿ããæ®ãã®åé¡ãä¿®æ£ããäºå®ã§ããnull-safetyãå®å®ãªãªãŒã¹ã§ãªãªãŒã¹ãããå ·äœçãªã¿ã€ã ã©ã€ã³ãæå®ããã®ã¯é£ããã§ãããæ¥å¹Žã®åããèããŠããŸãã
ããªãã®ãµããŒããšãã£ãŒãããã¯ãããããšãïŒDartãããå ç¢ãªèšèªã«ããFlutterããã匷åãªãã¬ãŒã ã¯ãŒã¯ã«ããããã«åãçµãã§ããŸãã
Dart andFlutterã®è£œåãããŒãžã£ãŒã§ããMichaelThomsenãããã®èšäºãDartlangã®å ¬åŒããã°ã«æçš¿ããŸãããMichaelã®è©±ãèããŠã圌ãšçŽæ¥å¯Ÿè©±ãããå Žåã¯ã12æ4æ¥ãš5æ¥ã«DartUP 2020 Onlineã«ã¢ã¯ã»ã¹ããŠãDartããŒã ãšã³ãã¥ããã£ãšææ°ã®èšèªã¢ããããŒãã«ã€ããŠè©±ãåã£ãŠãã ããã