[ð°åå¿è åãð°]Flutter/dartã§åŠã¶ããã°ã©ãã³ã° ~nullãèš±ããšã¯~
ãœã¡ãœã¡ã®ã€ã©ãGW Advent(?) Calendar9æ¥ç®ã®èšäºã§ãïŒ
仿¥ãæšæ¥ã«ç¶ããŠåå¿è
åãã®å
容ã«ããŸãã
ã¢ããªéçºãããŠããäžã§é¿ããŠã¯éããªãénull
ç§ãå§ãããŠã®é ãnullã£ãŠãªãã ïŒïŒïŒïŒããããŒãã«ã«ãããªå¥Žãããã©ïŒããšãæã£ãŠãèš³ã§ããä»åã¯æ¹ããŠnullã«ã€ããŠèª¿ã¹ãŠã¿ãŸããã
ä»åãGPTå
çã«æããŠããããªããæžããŸãã
ã¿ããªnullã£ãŠèšããã©äœè ïŒ
ãšããããnull
ãGoogle翻蚳ã§ç¿»èš³ããŠã¿ãã
空çœ
ãšããæå³ãªãã§ããããªããšãªãèŠããŠããŸããã
GPTå çïŒ
nullïŒäœãå ¥ã£ãŠãªãç¶æ ã
ããŒãªãã»ã©Google翻蚳ãšåããããªçµæã§ããã
å®éã®ã³ãŒãäžã ãšãããªããŸãã
String? userName = null;
GPTå çïŒ
ããã¯ãååãå ¥ããå Žæã¯ãããã©ãä»ã¯ãŸã å ¥ã£ãŠãªãããã£ãŠããšã
nullã«ã€ãŠãªããšãªãèŠããŠããŸãããããã§äžã€çåãåºãŠããŸãã
ããã®ã³ãŒãStringã®åŸãã«?
ãã€ããŠãïŒïŒïŒãã£ãŠãªããŸãããã£ãŠããšã§æ¬¡ã¯ãã®ïŒ
ã«ã€ããŠã§ãã
nullãèš±ãã£ãŠã©ãããããšïŒ
ãããŸã§èªãã§ããšãªããšãªãnull
ãèš±ãã«ã€ããŠã®æå³ãããã£ãŠããŠãããªãšæããŸãã
ãããä»åãäŸã«ãã£ãŠãã°ã€ã³èªèšŒãäŸã«ç¢ºèªããŠè¡ããŸãã
ã¢ããªã«ãã°ã€ã³ããŠããªãæã¢ããªåŽã§ã¯ãä»ã®ãšãããã°ã€ã³ããŠã人ã¯ããŸããããšåŠçãããŠããŸãããã®æuser=null
ãšãªããŸãã
ãããã®æuserName
ã®nullãèš±ããŠããªããšãšã©ãŒã®åå ã«ãªãèœã¡ãŠããŸãå¯èœæ§ããããŸãã
String userName = null; // â ãšã©ãŒ
GPTå ç
ããã¯ã絶察ã«ååãå ¥ã£ãŠãã¯ãïŒãã£ãŠæ±ºããŠãã®ã«ã
å®éã«ã¯å ¥ã£ãŠãªã â ãšã©ãŒã«ãªãïŒ
ããããã©ããã°ãããã ð¡ãã£ãŠæãæ°æã¡ãæããŠããã£ãŠããã§ç»å Žããã®ãnullãèš±ãã§ããããã§ããã£ãããã¡ãã¡ãåºãŠããŠã?
ã§ãã
String? userName = null; // OK
ãããããæåã«åºãŠãã?
ã®æ£äœã§ããnull
ãèš±ããã³ãŒãã§ãã
å®éã®ãã°ã€ã³ã§èããã
å®éã«ãã°ã€ã³ãå®è£
ããæã¯Flutterã ãšFirebase AuthãSupabase authãå€ããšæããŸãã
ããããã®Flutterããã±ãŒãžã«ã¯Userã¯ã©ã¹ãçšæãããŠããŸãããããã䜿ãã°ãã°ã€ã³ããŠãããããŠããªãããç¬æã«å€æã§ããŸãã
/// Firebase
User? user = FirebaseAuth.instance.currentUser;
/// Supabase
User? user = Supabase.instance.client.auth.currentUser;
åºãŠããŸãã?
ããã¯userããŸã ãã°ã€ã³ããŠããªãå¯èœæ§ãèæ
®ãã?
ã§ãã
ãã°ã€ã³å
user==null
ãã°ã€ã³åŸ
user!=null
==
ã¯åã!=
ã¯~~ã§ã¯ãªãã®æå³ã§ãã
ãã®å Žåãã?
ãæããŠãããšã³ã³ãã€ã«ãšã©ãŒã«ãªã£ãŠåããªãã§ãã
ããã¯Flutter SDKã®è¿ãå€ãnullãèš±ããŠããã®ã§èš±ããŠããªã?
ãæããŠããã³ãŒãã ãšæããããšããèš³ã§ãã
User user = FirebaseAuth.instance.currentUser; // â ã³ã³ãã€ã«ãšã©ãŒ
å®è£ ãããŠãããšãªããšä»¥äžã®ããã«ãªããŸãã
if (user == null) {
// ãã°ã€ã³ããŠãªã â ãã°ã€ã³ç»é¢ã«é·ç§»
} else {
// ãã°ã€ã³æžã¿ â ããŒã ç»é¢ãž
}
GTPå ç
ã»User? ãšæžãã®ã¯ããã°ã€ã³ããŠãªãæããããããšãåæã«ããŠããã
ã»Authã䜿ãå Žåã¯ãnullã«ãªãå¯èœæ§ãã¡ãããšæ±ãããšãéèŠïŒ
ã»nullãã§ãã¯ãå¿ãããšã¢ããªãã¯ã©ãã·ã¥ããããšãããã®ã§èŠæ³šæïŒ
ããŒãð§ð§ð§ãªãã»ã©ãã¢ããªéçºã§å¿ èŠãªæããããŠããŸããã
Flutter(UIå®è£ )ã§ã®null蚱容
å®éã«Flutterããã£ãŠãUIåŽã§ãnullãèš±ãå¿
èŠãåºãŠããŸãã
äŸãã°ã²ã¹ãã¢ãŒããå®è£
ããŠããå Žåã²ã¹ãã®ãŠãŒã¶ãŒã¯userName
ãååšããªãã®ã§null蚱容ã§ã²ã¹ãã衚瀺ããå¿
èŠããããšæããŸãã
String? userName;
Text(userName ?? 'ã²ã¹ã');
GPTå ç:
?? ã¯ããªããã°ããã
ãããå®éã«éçºãããšããã ãã§ã¯ãªãããšãããããŸãããŠãŒã¶ãŒãéžæããŠããã®ãããªãã®ãããã°ã€ã³ããŠãããããªããã§è¡šç€ºã倿Žããå¿
èŠããããšæããŸãããã®æäœ¿çšããã®ã:
ãš?
ã§ããäžè§æŒç®åãšãèšããããããŸãã
User? user;
user == null
? ElevatedButton(
onPressed: () {
// ãã°ã€ã³ç»é¢ãžé·ç§»
},
child: Text('ãã°ã€ã³'),
)
: Text('ãã°ã€ã³äž ${user.name}');
GPTå çïŒ
? ã¯ãããããªããã®åå²ïŒäžé æŒç®åïŒ
user ã null蚱容(User?)ã«ããŠããããããç¶æ ã«å¿ããUIãåºãã
UIãnullãããã§ãªããã§åããŠå€æŽããããšãã§ããããšãããã£ããšæããŸãã
ããã䜿ãã°ããŒãäžãåŠããå€å¥ããŠããŒãäžãªãã¯ã«ã¯ã«ã衚瀺ããŠå®äºãããã³ã³ãã³ãã衚瀺ããããã«ããã°è¯ãããšããããããšæããŸãã
ãããå®éã®éçºçŸå Žã§ã¯nullãèš±ããšããå Žé¢ã¯ãã°ã€ã³ã ãã§ã¯ãããŸããã
æåŸã«ç§ãå®éã«äœ¿çšããäŸãèŠãŠã¿ãŸãããã
å®éã«äœ¿ã£ãŠã¿ãã!
ãã®æã¯SNSç³»ã®ã¢ããªãéçºããŠããåçã®æçš¿æ©èœãå®è£
ããæãã¿ãŠã¿ãŸãã
SNSã§ã¯instagramã®ãããªçµ¶å¯Ÿã«åçãæ±ããããå ŽåãšXãGoogleMapã®è©äŸ¡ã¿ããã«åçããã£ãŠããªããŠãè¯ãå Žåã®ïŒãã¿ãŒã³ãèãããããšæããŸããã©ã¡ãã®ã¢ããªãäœæããã«ããŠãåçãéžæãããããããªãããå€å¥ããå¿
èŠããããšæããŸãã
import 'dart:io';
/*----------------*/
File? selectedImage = null;ã/// fileãéžæãããŠããnullã§å€æ
ãã®åŸimagePicker(端æ«å
ã®ç»åã«ã¢ã¯ã»ã¹)ã§éžæãããã¡ã€ã«ã¯Xfile
ãªã®ã§Fileã«å€æããåŠçãæžããŸãã
ãã®æãpickedFileã¯null
ã®å¯èœæ§ãããã®ã§?
ã§null
ãèš±ãããã«ããŸãã
import 'package:image_picker/image_picker.dart';
/*----------------*/
Future<void> album() async {
final picker = ImagePicker();
final XFile? pickedFile = await picker.pickImage(source: ImageSource.gallery);
if (pickedFile != null) {
setState(() {
selectedImage = File(pickedFile.path);
});
}
}
UIå®è£
ãèŠãŠã¿ãŸããUIåŽã§ã¯å
ã»ã©ã®:
ãš?
ã®äžè§æŒç®åã䜿ã£ãŠnull
ãã©ãããå€å®ããŠç»åéžæãã¿ã³ãšç»åãåãæ¿ããŠããŸãã
ç»åã®äžã«ãããã¿ã³ãèšçœ®ããŠãããã¿ã³ãæŒããæã«selectedImageãnullã«ããŠãŸãç»åã®éžæãã¿ã³ã«ãããšããå®è£
ã«ããŸãã
selectedImage != null
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
IconButton(
onPressed: () {
setState(() {
selectedImage = null;
});
},
icon: const Icon(Icons.close),
),
Align(
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 2,
horizontal: 32,
),
child: Image.file(
selectedImage!,
fit: BoxFit.contain,
),
),
),
],
)
: TextButton(
onPressed: () => album(),
child: const Text(
'ç»åãéžæ',
style: TextStyle(
fontSize: 24,
color: Colors.blue,
),
),
),
以äžãå®éã®äœ¿çšäŸã®äžéšã§ããä»ã«ãå®è£ äŸã¯ãããšæããŸããä»åã¯å æ¥ç§ãå®éã«è¡ã£ãå®è£ äŸã«ãªããŸããã
ãŸãšã
null
ãšèšãã®ã¯äœãå
¥ã£ãŠãªãç¶æ
ã®ããšãæããString? userName ã®ããã«ããŠãŒã¶ãŒåããŸã å
¥åãããŠããªããããããªããç¶æ³ãåã·ã¹ãã ã§è¡šçŸããããšã§ãããŸãUIäžã§ãç»åãéžæããŠããªããããªãã·ã§ã³å
¥åãªã®ã§ç©ºã§ã OKããªã©ãå®éã®ã¢ããªãããŒã«å³ããæè»ãªåãæ±ããã§ããããã«ãªããŸãã
ãããããŸã掻çšããã°æ§ã
ãªã¢ããªãéçºã§ããããã«ãªããšæããŸãã
ãšããããã§ããœã¡ãœã¡ã®ã€ã©ãGW Advent(?) Calendar ïŒæ¥ç®ã¯null
ã«ã€ããŠåŠã³ãŸããã
Discussion