DartPadãšããå
¬åŒã®ãªã³ã©ã€ã³IDEã䜿ã£ãŠãTodoãªã¹ããäœã£ãŠãããŸãããïŒ
DartPadã¯ãã¡ãïŒ â https://dartpad.dev
çµäºæã«ããããéæã§ããŠããã°å®ç§ã§ãïŒ
é 匵ã£ãŠãããŸãããã
Flutter ãš DartPad ã«ã€ããŠã軜ããå匷ããŸãããã
Flutter 㯠Google ãæäŸããããã«ããã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ãã¬ãŒã ã¯ãŒã¯ã§ãã
ã€ãŸããFlutterã ãã§Android, iOS, Windows, Macãªã©ããŸããŸãªæ©åšã察象ãšããã¢ããªãäœæããããšãã§ããŸãã
éçºèšèªãšããŠã¯ Dart ãšããèšèªãæ¡çšããŠããŸãã
Flutter ãäœãããã£ããšæãã®ã§ãããã§ã¯ãDartPad ã§ããã°ã©ã ãåãããŠã¿ãŸãããã
ãŸãã¯ãFlutterã§ã¯ãªããDartã®ããã°ã©ã ãåãããŠã¿ãŸãã
DartPad ãéããŠãç»é¢äžéšã®ãNew PadããéžæããŸãã
HTMLã®ãã°ã«ãç»åã®ããã«ãªãã«ãªã£ãŠããããšã確èªããŠãDartãéžæããŸãã
ãã®åŸãç»é¢å·ŠåŽã«äžèšç»åãšåãããã°ã©ã ãæžãããŠããã°OKã§ãã
ããã°ã©ã ã®åããæ¹ã¯ç°¡åã§ããRunãã¿ã³ãæŒããŠã¿ãŸããããããã ãã§å®è¡ã§ããŸãã
hello 1 ãã hello 5ãŸã§åºåã§ãããOKã§ãã
åãããã«ãFlutterã®ããã°ã©ã ãåãããŠã¿ãŸãããïŒ
New Pad ããä»åºŠã¯ Flutter ãéžæããŸããå³åŽã®æ¬ãUI Output ã«å€ãã£ãŠããã°OKã§ãã
RunãæŒããŠå®è¡ããŠã¿ãŸããããHello, World!ãåºãŠããã®ã確èªããŠãã ããã
ããã§ãDart / Flutter ã©ã¡ãã®ããã°ã©ã ã DartPad ã䜿çšããŠå®è¡ããããšãã§ããŸããã
ããããèŠããŠã次ã«é²ã¿ãŸãããïŒ
ããã§ã¯ãWidgetã«ã€ããŠåŠç¿ããŠãããŸãã
Widget ã¯ãFlutter ã® UI ãæ§ç¯ããããã®ããŒãã®ããšã§ãã
ããŸããŸãª Widget ãçµã¿åãããŠããããšã§ãUI ãäœã£ãŠãããŸãã
å®éã«ããã°ã©ã ãèŠãŠç¢ºèªããŸãã
DartPadã®å³äžã« Samples ãšããã¡ãã¥ãŒããããŸãã
ãã®äžãããCounterãšããããã°ã©ã ãéžãã§å®è¡ããŠã¿ãŸãããã
+ãã¿ã³ãæŒããšäžå€®ã®æ°ãå¢ããŠããããã°ã©ã ã§ãã
ãã®ã¢ããªã§ã¯ã以äžã®Widgetã䜿çšãããŠããŸãã
StatelessWidget
ãš StatefulWidget
Flutter ã§äœ¿çšããã Widget ã¯å€§ãã2ã€ã«åããããšãã§ããŸãã
StatelessWidget
ãš StatefulWidget
ã§ãã
ååã®éãã§ãããstate ããããã©ãã ãšããéãããããŸãã
Flutter ã®å ¬åŒããã¥ã¡ã³ãã§ã¯ãäžèšç»åã®ããã«ãbuild ãšãã function ( 颿° ) ã«ãstate ãæž¡ãããšã§ãUI ãæ§ç¯ããããšãã説æããããŸãã
Widget ã¯ãã¢ããªã®ç¶æ
ã衚瀺ããããã®èšèšå³ãšãã£ã圢ã§ãç¶æ
( state )ãäžãããããšãWidget ã® build ã¡ãœããã UI ãæ§ç¯ããŸãã
ãã®ç¶æ
( state )ãå¿
èŠãšãã Widget 㯠StatefulWidget ãå¿
èŠãšããªããã®ã¯ StatelessWidget ãçšããŠäœæããŠãããŸãã
æåã«åããããHello WorldããšåºãŠããã ãã®ã¢ããªã§ã¯ãæéçµéããŠãŒã¶ãŒã®æäœã«å¿ããŠUIãå€ããããšããããŸãããã
ãããã£ãäžåºŠæ§ç¯ããããã®åŸã¯å€åããªããã®ã«ã€ããŠã¯ãStatelessWidgetã䜿çšããŸãã
// StatelessWidgetã§ã¯ãç¶æ
ããªãã®ã§buildã¡ãœãããWidgetã¯ã©ã¹ã«çŽæ¥æžã
class Hoge extends StatelessWidget {
Hoge({super.key});
@override
Widget build(BuildContext context) {
return Container();
}
}
äžæ¹ã§ãä»åãããŠããã«ãŠã³ãã¢ããªã§ã¯ããŠãŒã¶ãŒã+ãã¿ã³ãæŒããã³ãæŒããåæ°ã衚瀺ãå¢ãããŠããå¿
èŠããããŸãã
ãã®ãããªãUIãåçã«å€åããå¿
èŠããããã®ã«ã€ããŠã¯ãStatefulWidgetã䜿çšããŸãã
StatefulWidget
ã¯å€æŽå¯èœãªç¶æ
ãå¥ã® State
ã¯ã©ã¹ã«ä¿åããŸãã
ãã¹ãŠã® StatefulWidget
ã¯å¿
ããcreateState()
ã¡ãœããããªãŒããŒã©ã€ãããŠãState
ã¯ã©ã¹ãè¿ãããã«å®è£
ããå¿
èŠããããŸãã
äžèšã®äŸã§ã¯ãFuga
ãšãã StatefulWidget
ã§ã_FugaState
ãšãã State
ã createState()
ã§è¿ãããã«ããŠããŸãã
ãããŠããã® _FugaState
ã®äžã§ãã§ãã¯ããã¯ã¹ããã§ãã¯ãããŠãããã©ããã瀺ããisChecked
ãšãã bool å€( true / false )ãç¶æ
ãšããŠæã£ãŠããŸãã
ãã®ç¶æ
ããã æŽæ°ããã ãã§ã¯ãUIã¯æŽæ°ãããŸãããç¶æ
ãæŽæ°ããå Žåã¯ãsetState(() {})
ã¡ãœãããå©ããŸãã
UIãæŽæ°ã㊠setState
ãè¡ããšãå¿
èŠãªéšåã®UIãåæ§ç¯(ãªãã«ã)ãããŸãã
// StatefulWidgetã§ã¯ãç¶æ
ã®ã¯ã©ã¹(State)ãäœæããŠãç¶æ
ãbuildã¡ãœããããã¡ãã®ã¯ã©ã¹ã«èšå
¥ãã
class Fuga extends StatefulWidget {
Fuga({super.key});
@override
State<Fuga> createState() => _FugaState();
}
class _FugaState extends State<Fuga> {
bool isChecked = false; // ãããç¶æ
(state)
@override
Widget build(BuildContext context) {
return Container(
child: CheckBox(
value: isChecked,
onChanged: (value) {
// å€ãæŽæ°ããæã¯ãsetStateã䜿ã
setState(() {
isChecked = value;
});
},
),
);
}
}
ãå匷ããŒããå°ãé·ããªã£ãŠããŸããŸããããããããã¯æ©éTodoãªã¹ããå®è£
ããŠãããŸãããïŒ
ä»åã¯æéã®éœåäžãUIã®ããã°ã©ã ã ããã¡ãã§å®è£
ããŸããã
ããã°ã©ã -> https://gist.github.com/nabe1005/c16d824012173f85d8df521a3771b123
ãŸããDartPad ãéããŠãç»é¢äžéšã®ãCounter exampleããšæžããŠããã¿ã€ãã«éšåãã¯ãªãã¯ããŠãã ããã
ç·šéãã§ããã¯ããªã®ã§ããTodo Listããªã©ã®é©åœãªååã«å€ããŠãã ããã
ååã倿Žã§ããããäžèš Gist ã®ãªã³ã¯ããããã°ã©ã ãå
šãŠã³ããŒããŠãDartPad ã«æã£ãŠããŠãã ããã
äžåºŠã詊ãã«åäœãããŠã¿ãŸããããæ£ããããã°ã©ã ãåäœããŠããå Žåã¯äžèšã®ããã«ãªãããšæããŸãã
ãã®ããã°ã©ã ã¯æªå®æã§ãäžéšæ©èœãåäœããªããªã£ãŠããŸã(æå³çã«è©²åœéšåã®ããã°ã©ã ã ãæªå®è£
ã®ãŸãŸã«ããŠããŸã)ã
ãã®ããšããã®2æ©èœã®å®è£ ã«ãã£ã¬ã³ãžããŠã¿ãŸãã
ã§ã¯ãå®è£ ã«é²ãåã«äžåºŠã³ããŒããŠããããã°ã©ã ã確èªããŠãããŸãããã
Widget ãšããŠã¯ãTodoList
ãšãã StatefulWidget ããã£ãŠãããã¢ããªã®ç»é¢å
šäœã® Widget ãšãªã£ãŠããŸãã
æã£ãŠããç¶æ
ãšããŠãList<Map<String, dynamic>>
åã® todoList
ãšãã倿°ãçšæãããŠããŠããµã³ãã«ãšããŠäžã«3ã€ã»ã©å€ãå
¥ã£ãŠããŸãã
倿°ã®åã«ã€ããŠã¯çè§£ã§ããªããŠã OK ã§ããtodoList
㯠json ã®é
åã«ãªã£ãŠãããšã€ã¡ãŒãžããŠãã ããã
ãã® todoList
ãã¿ã¹ã¯äžèЧãšãªã£ãŠããŸããäžèº«ã®å€ã«çç®ããŠã¿ããšãcontent
ãš isFinish
ãšããå€ããããŸãã
content
ã«ã¯å
¥åããããã¿ã¹ã¯ã®å
容ããisFinish
ã«ã¯ãã¿ã¹ã¯ã®å®äºç¶æ
ããèšå®ãããŠããŸãã
ãããã«ã奜ããªã¿ã¹ã¯ã® isFinish
ã true
ã«ããŠåãããŠã¿ããšãã§ãã¯ããã¯ã¹ã«ãã§ãã¯ãå
¥ãããšã確èªã§ããŸãã
æ©éã1ã€ç®ã®å®è£
ãšããŠãã¿ã¹ã¯ãå®äºãããããããã«ããŠãããŸãã
ãã§ãã¯ããã¯ã¹ãæŒãããããã§ãã¯ãã€ãããå€ãããã§ããããã«ããŠãã¿ã¹ã¯ã®å®äºã»æªå®äºãåãæ¿ããããããã«ããŸãããã
åã®ã»ã¯ã·ã§ã³ã§èª¬æããŸããããã¿ã¹ã¯ã®å®äºç¶æ
㯠isFinish
ãã©ã°ã§å€å®ããŠããŸãã
ã²ãšã€ã²ãšã€ã®ã¿ã¹ã¯ã¯ã52 è¡ç®ããã® ListView.builder()
ãŠã£ãžã§ããå
ã® itemBuilder
ã§è¡šç€ºãããŠããŸãã
itemBuilder
ã§ index
ãåãåãããšãã§ããã®ã§ã53 è¡ç®ã§ todoList
ãã index
çªã®ã¿ã¹ã¯ã todo
倿°ã«ä»£å
¥ããŠããŸãã
ãŸãããã§ãã¯ããã¯ã¹ã衚瀺ããŠãã CheckBox
Widget ãæ¢ããŠã¿ãŸãããã
ããèŠã¥ãããããããŸããããCheckBox
㯠value
, onChanged
, side
ã®3ã€ã®ãã©ã¡ãŒã¿ãæå®ãããŠããŸãã
value
ã«ã¯ãã§ãã¯ããã¯ã¹ã®ç¶æ
ãæå®ããå€ãæå®ããŸãã
ä»å㯠todo
ã® isFinish
ãæå®ãããŠããŸã( todo['isFinish']
)ã
side ã§ã¯æ ç·ã®æå®ãããŠããŠãä»åã¯æ ç·ãçœãã»å€ªããªãããèšå®ããŠããŸãã
æåŸã« onChanged
ã§ãããååã®éããã§ãã¯ããã¯ã¹ã®å€ãåãæ¿ããã¿ã€ãã³ã°ã§ãã®äžã«æžããåŠçãå®è¡ãããŸãã
åŒæ°ãšã㊠v
ãåãåã£ãŠããŸãããããã«ã¯æŽæ°åŸã®ãã§ãã¯ããã¯ã¹ã®å€ã代å
¥ãããŠããŸãã
ã€ãŸãããã§ãã¯ãå
¥ã£ãŠãªãç¶æ
ã§ãã§ãã¯ããã¯ã¹ãæŒããããšãv
ã« true
ãå
¥ã£ãç¶æ
ã§ onChanged
ãåããŸãã
ã³ã¡ã³ãã®éããä»ã¯äœã®åŠçãè¡ã£ãŠããŸããããããã«ãã§ãã¯ããã¯ã¹ã®å€ãæŽæ°ããããã°ã©ã ãæžãã°ããã§ãã¯ããã¯ã¹ãåããããã§ããã
ãããŸã§ã®å 容ã䜿ã£ãŠèãããšã以äžã®ããã«å®è£ ããã°ããŸãåãããã§ããïŒ
ç¶æ
ãæŽæ°ãããšãã¯äžèšããã°ã©ã ã®ããã« setState
ãåŒã³ãŸãã
isFinish
ãé©åã«æŽæ°ããããšããã§ãã¯ããã¯ã¹ã®ç¶æ
ãå€ãã£ãŠããæãã«åæç»ããŠããããã§ããã
isFinish
ã«ã¯ã©ããªå€ãå
¥ããããã§ãã¯ãã€ãããå€ãããã§ããã§ããããïŒ
ã§ã¯1ã€ç®ãããã£ãŠãããŸãããã
ãã§ãã¯ããã¯ã¹ã®å€ãåãæ¿ãããã³ã«åããonChanged
ãšãããã©ã¡ãŒã¿ãæ¢ããŸãããã
äžè¿°ã®ãšãããããã§ã¯æŽæ°åŸã®å€ v
ãåãåã£ã颿°ãšãªã£ãŠãŸãã
ãã®é¢æ°å
ã§ãã§ãã¯ããã¯ã¹ã®å€(ç¶æ
)ãæŽæ°ããã®ã§ãã²ãšãŸããã®äžã§ setState
ãåŒã³ãŸãã
onChanged: (v) {
// ãã§ãã¯ããŒã¯ãæŒãããšã
// å®äºç¶æ
ãå€ããããã°ã©ã ãæžããïŒ
setState(() {});
}
ã§ã¯ãã® setState
ã®äžã§ isFinish
ã®æŽæ°ãè¡ããŸãã
CheckBox
Widget ã®ç¶æ
ãæå®ãããã©ã¡ãŒã¿ã® value
ã§ã¯ãisFinish
ã䜿ãããŠããŸãããã©ã®ããã«æå®ãããŠããã確èªããªããããã®å€ãæŽæ°ããŸãã
onChanged
ã®åŒæ° v
ã«ã¯ãæŽæ°åŸã®å€ãå
¥ãã®ã§ãisFinish
ã« v
ã代å
¥ããã°è¯ãããã§ããã
onChanged: (v) {
// ãã§ãã¯ããŒã¯ãæŒãããšã
// å®äºç¶æ
ãå€ããããã°ã©ã ãæžããïŒ
setState(() {
todo['isFinish'] = v;
});
}
äžèšã®ããã«æŽæ°ã§ããããRun ã§å®éã«ãã§ãã¯ããã¯ã¹ãåãã確èªããŠã¿ãŠãã ããã
ä»åºŠã¯ãäžã®ããã¹ããã£ãŒã«ããã todoãããããšã远å ã§ããããã«ããŠãããŸãã
ããã¹ããã£ãŒã«ãããããã¹ããéä¿¡ãããã¿ã€ãã³ã°ã§æžããŠããå
容ã todoList
ã«è¿œå ã§ããã°è¯ãããã§ããã
ããã¹ããã£ãŒã«ãã¯ã101è¡ç®ã® TextField
Widget ã§è¡šç€ºããŠããŸãã
ããã¹ãã®éä¿¡æã«ã¯ãonSubmitted
ãã©ã¡ãŒã¿ã«æå®ãããå
容ãåããŸãã
åŒæ°ã«ã¯å
ã»ã©ãšåæ§ v
ãåãåã£ãŠããŸããããã¡ãã«ã¯å
¥åãããããã¹ããå
¥ã£ãŠããŸãã
ãã®äžèº«ã«ãã¿ã¹ã¯ã远å ããã³ãŒããå®è£
ããŠã¿ãŸãããïŒ
(äžçªäžã«è§£çãèŒããã®ã§ãèŠãªãã§ãã£ãŠã¿ãŠãã ãã)
âïž ãã³ã
Map<String, dynamic>
å (json)ã§ç»é²ããŸã
todoList.add(远å ããèŠçŽ )
ã®ããã«æžããŸã_controller
㯠TextEditingController
ãšãããã®ã§å
¥åãããŠããããã¹ããããããæäœã§ããŸã_controller.clear();
ãåŒã¶ãšå
¥åãããŠããããã¹ããæ¶ããŸãadd ã¡ãœããã«ã€ããŠ
dart ã® List å (é
åã®ããšã§ã)ã«ã¯ãèŠçŽ ã远å ããéã®ã¡ãœãããadd() ãçšæãããŠããŸãã
ä»åã®Todoã倧å
㯠List åãšãªã£ãŠããã®ã§ãèŠçŽ ã远å ããã«ã¯ãã®ã¡ãœããã䜿çšããŠããããšç°¡åã«å®è£
ããããšãã§ããŸãã
// todoListã«äœã远å ããããšã
todoList.add({ content: 'ãŠããš', isFinish: false });
äžèš2ã€ã®å®è£
ãã§ãããã以äžã®å®è£
ããã£ãŠã¿ãŸãããã
å®è£
ããäžã§ã¯ããã®è³æã«åºãŠããŠãªã Widget ãå¿
èŠã«å¿ããŠå©çšããå¿
èŠããããŸãã
ãã³ãã¯å°ãªãã«ããŠããŸãã
æ°ããã¿ã¹ã¯ã远å ã§ããããã«ãªããŸããããééã£ãŠå
¥åããTodoã远å ããŠããŸã£ããšããªã©ã«æ¶ããªãã®ã¯ã¡ãã£ãšäžäŸ¿ã§ããâŠã
ãšããããšã§ä»¥äž2ã€ã®æ¹æ³ã®ã©ã¡ããã§å®è£
ããŠã¿ãŠãã ããã
ãç²ãæ§ã§ããïŒ
ã²ãšãŸããTODO ãªã¹ãã宿ããŸãããããããåäœãšããŠã¯ãŸã ãŸã å¿
èŠæäœéã§ãã
ã¿ã¹ã¯äžèЧãã¢ããªã®ç¶æ
ãšããŠããä¿æããŠããªãã®ã§ãã¢ããªãåèµ·åãããšã¿ã¹ã¯ãæ¶ããŸãã
ã¿ã¹ã¯ã®ç·šéã»åé€ãææ¥ã®èšå®ãªã©ãªã©ããããããšã¯ãŸã ãŸã ããããæ®ã£ãŠããŸãã
ä»åã¯ç¹ã«è§ŠããŸããã§ããããUIãããŸãã«ã¹ã¿ãã€ãºããŠãªããŸãŸãªã®ã§ãäžèšã®å 容ãšåãããŠèª¿ã¹ãŠã¿ããäœã蟌ãã§ã¿ããããŠããããšå¬ããã§ãã
ä»åã®å 容ãã«ã¹ã¿ãã€ãºã§ã€ãŸã¥ããããšãããã°ãã¡ãŒã«(intern-info@jig.jp)ãTwitter(https://twitter.com/jig_saiyo)ã®DMã§èããŠãããã°äžç·ã«èããŸãã®ã§ããæ°è»œã«èããŠãã ããïŒ
ã¿ã¹ã¯ã远å ããŠã¿ããïŒã®è§£çã以äžã«ç€ºããŸãã
onSubmitted ã§å
¥åãããããã¹ã v ã content ãšã㊠todoList ã«è¿œå ãããšã¿ã¹ã¯ã远å ããããšãã§ããŸãã
ã¿ã¹ã¯ã®ç»é²æãå®äºç¶æ
ã¯çµ¶å¯Ÿæªå®äºã§ããã¯ããªã®ã§ãisFinish ã false ãšããŠç»é²ããŸãããã
å
ã»ã©ãšåæ§ã«ãç¶æ
ã®æŽæ°æã«ã¯ setState ãåŒã¶ããšïŒ
onSubmitted: (String v) {
// å
¥åããããã¹ãã®éä¿¡æ
// å
¥åãããæåãtodoã«ç»é²ããããã°ã©ã ãæžããïŒ
setState(() {
todoList.add({'content': v, 'isFinish': false});
_controller.clear();
});
},