
key
ãã©ã¡ãŒã¿ãŒã¯ãã»ãšãã©ãã¹ãŠã®ãŠã£ãžã§ããã³ã³ã¹ãã©ã¯ã¿ãŒã§èŠã€ããããšãã§ããŸããããã®ãã©ã¡ãŒã¿ãŒã¯éçºã§ã¯ã»ãšãã©äœ¿çšãããŸããã Keys
ã¯ããŠã£ãžã§ããããªãŒå
ã®ãŠã£ãžã§ãããç§»åãããšãã«ç¶æ
ãä¿æããŸãã å®éã«ã¯ãããã¯ãã³ã¬ã¯ã·ã§ã³ã®å€æŽæã«ãŠãŒã¶ãŒã®ã¹ã¯ããŒã«äœçœ®ãä¿åããããç¶æ
ãä¿åãããããã®ã«åœ¹ç«ã€å¯èœæ§ãããããšãæå³ããŸãã
ãã®èšäºã¯ã次ã®ãããªããã®æç²ã§ãã èªããããèã/èŠãããšã奜ãå Žåããããªã¯åãçŽ æãæäŸããŸãã
ã»ãšãã©ã®å Žå... keys
ã¯å¿
èŠãããŸããã äžè¬ã«ããããã远å ããŠã害ã¯ãããŸããããæ°ãã倿°ã®äž¡åŽã§æ°ããããŒã¯ãŒããŸãã¯å宣èšãšããŠè¡ãããããããããå¿
èŠãããŸããïŒç§ã¯ããªãã«ã€ããŠè©±ããŠããã Map<Foo, Bar> aMap = Map<Foo, Bar>()
ïŒã
ãã ããäœããã®ç¶æ
ãå«ã¿ãåãã¿ã€ãã®ãŠã£ãžã§ãããã³ã¬ã¯ã·ã§ã³å
ã§è¿œå ãåé€ããŸãã¯åé
眮ããŠããå Žåã¯ã keys
泚æããå¿
èŠãããkeys
ïŒ
ãŠã£ãžã§ããã®ã³ã¬ã¯ã·ã§ã³ã倿Žãããšãã«keys
ãå¿
èŠãªçç±ã瀺ãããã«ããã¿ã³ãã¯ãªãã¯ããããšãã«å Žæã倿Žãã2ã€ã®ã«ã©ãã«ãªãŠã£ãžã§ãããæã€éåžžã«ã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã

ãã®ããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãè²ãŠã£ãžã§ããã®é åºãæ ŒçŽããããã«ã Row
ãšStateedTilesãŠã£ãžã§ããã«ç¶æ
ïŒ StatefulWidget
ïŒã®ã©ã³ãã ãªè²ã®2ã€ã®ã¹ããŒãã¬ã¹ãŠã£ãžã§ããïŒ StatelessWidget
ïŒããããŸãã äžã®FloatingActionButton
ãã¿ã³ãã¯ãªãã¯ãããšãè²ãŠã£ãžã§ããããªã¹ãå
ã®äœçœ®ãæ£ãã倿ŽããŸãã
void main() => runApp(new MaterialApp(home: PositionedTiles())); class PositionedTiles extends StatefulWidget { @override State<StatefulWidget> createState() => PositionedTilesState(); } class PositionedTilesState extends State<PositionedTiles> { List<Widget> tiles = [ StatelessColorfulTile(), StatelessColorfulTile(), ]; @override Widget build(BuildContext context) { return Scaffold( body: Row(children: tiles), floatingActionButton: FloatingActionButton( child: Icon(Icons.sentiment_very_satisfied), onPressed: swapTiles), ); } swapTiles() { setState(() { tiles.insert(1, tiles.removeAt(0)); }); } } class StatelessColorfulTile extends StatelessWidget { Color myColor = UniqueColorGenerator.getColor(); @override Widget build(BuildContext context) { return Container( color: myColor, child: Padding(padding: EdgeInsets.all(70.0))); } }
ããããã«ã©ãŒãŠã£ãžã§ããã«ç¶æ
ã远å ããŠïŒ StatefulWidget
ïŒãè²ãä¿åãããšããã¿ã³ãã¯ãªãã¯ãããšãäœãèµ·ããŠããªãããã«èŠããŸãã

List<Widget> tiles = [ StatefulColorfulTile(), StatefulColorfulTile(), ]; ... class StatefulColorfulTile extends StatefulWidget { @override ColorfulTileState createState() => ColorfulTileState(); } class ColorfulTileState extends State<ColorfulTile> { Color myColor; @override void initState() { super.initState(); myColor = UniqueColorGenerator.getColor(); } @override Widget build(BuildContext context) { return Container( color: myColor, child: Padding( padding: EdgeInsets.all(70.0), )); } }
説æãšããŠïŒäžèšã®ã³ãŒãã¯ããŠãŒã¶ãŒããã¿ã³ãã¯ãªãã¯ããŠãè²ã®äº€æã衚瀺ãããªããšããç¹ã§ãã°ããããŸãã ãã®ãšã©ãŒãä¿®æ£ããã«ã¯ãè²ä»ãã®StatefulWidget
ãŠã£ãžã§ããã«key
ãã©ã¡ãŒã¿ãŒã远å ããå¿
èŠããããŸãããããããšããŠã£ãžã§ããã¯å¿
èŠã«å¿ããŠäº€æãããŸãã

List<Widget> tiles = [ StatefulColorfulTile(key: UniqueKey()),
ãã ããããã¯ã倿ŽãããµãããªãŒã«ç¶æ
ãæã€ãŠã£ãžã§ãããããå Žåã«ã®ã¿å¿
èŠã§ãã ã³ã¬ã¯ã·ã§ã³å
ã®ãŠã£ãžã§ããã®ãµãããªãŒå
šäœã«ç¶æ
ããªãå ŽåãããŒã¯å¿
èŠãããŸããã
è¡ããïŒ ãã¹ãŠã®ãã¹ãŠã Flutter
keys
ã䜿çšããããã«ç¥ã£ãŠããå¿
èŠããããã¹ãŠã ããããããªããèµ·ãã£ãŠããããšã«å°ãæ·±ãè¡ããããªã...
keys
å¿
èŠãªå Žåkeys
ããçç±ãçè§£ãã
ããªãã¯ãŸã ããã«ããŸãããïŒ ããã§ã¯ãèŠçŽ ããªãŒãšãŠã£ãžã§ããã®çã®æ§è³ªã調ã¹ãŠããã©ãã¿ãŒã¡ã€ãžã«ãªããïŒ ãã¯ã¯ã¯ïŒ ãã ãã ããããªãã
ãåãã®ãšãããåãŠã£ãžã§ããå
ã§Flutterã¯å¯Ÿå¿ããèŠçŽ ãäœæããŸãã FlutterããŠã£ãžã§ããããªãŒãäœæããããã«ãèŠçŽ ããªãŒïŒElementTreeïŒãäœæããŸãã ElementTreeã¯éåžžã«ã·ã³ãã«ã§ãåãŠã£ãžã§ããã®ã¿ã€ãæ
å ±ãšåèŠçŽ ãžã®ãªã³ã¯ã®ã¿ãå«ãŸããŠããŸãã ElementTreeãFlutterã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ã«ãã³ãšèããããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®æ§é ã瀺ããŠããŸãããè¿œå æ
å ±ã¯ãã¹ãŠãœãŒã¹ãŠã£ãžã§ãããžã®ãªã³ã¯ã«ãããŸãã
äžèšã®äŸã®è¡ãŠã£ãžã§ããã«ã¯ããã®åããšã«é åºä»ããããã¹ãããã®ã»ãããå«ãŸããŠããŸãã Rowã®ã«ã©ãŒãŠã£ãžã§ããã®é åºã倿ŽãããšãFlutterã¯ElementTreeãæ©ãåããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ã«ãã³æ§é ãåããã©ããã確èªããŸãã

æ€èšŒã¯RowElementã§å§ãŸããæ¬¡ã«åèŠçŽ ã«é²ã¿ãŸãã ElementTreeã¯ãæ°ãããŠã£ãžã§ãããå€ããã®ãšåãã¿ã€ããškey
ãæã£ãŠããããšããã§ãã¯ãããããããªããèŠçŽ ã¯æ°ãããŠã£ãžã§ãããžã®ãªã³ã¯ãæŽæ°ããŸãã ã³ãŒãã®ã¹ããŒãã¬ã¹ããŒãžã§ã³ã§ã¯ããŠã£ãžã§ããã«key
ããªããããFlutterã¯ã¿ã€ãã®ã¿ããã§ãã¯ããŸãã ïŒäžåºŠã«æ
å ±ãå€ãããå Žåã¯ãäžèšã®ã¢ãã¡ãŒã·ã§ã³ãã£ãŒããåç
§ããŠãã ãããïŒ
ç¶æ
ãŠã£ãžã§ããã®ElementTreeã®äžã¯å°ãç°ãªããŸãã åãšåãããã«ãŠã£ãžã§ãããšèŠçŽ ããããŸããããŠã£ãžã§ããã®ç¶æ
ãªããžã§ã¯ããããã€ããããè²æ
å ±ã¯ãŠã£ãžã§ããèªäœã§ã¯ãªãããããã«ä¿åãããŸãã

key
ãªãè²ä»ãã®StatefulWidget
ãŠã£ãžã§ããã®å Žåã2ã€ã®ãŠã£ãžã§ããã®é åºã倿ŽãããšãFlutterã¯ElementTreeãå·¡åããRowWidgetã®ã¿ã€ãããã§ãã¯ããŠããªã³ã¯ãæŽæ°ããŸãã æ¬¡ã«ãã«ã©ãŒãŠã£ãžã§ããèŠçŽ ã¯ã察å¿ãããŠã£ãžã§ãããåãã¿ã€ãã§ããããšã確èªãããªã³ã¯ãæŽæ°ããŸãã 2çªç®ã®ãŠã£ãžã§ããã§ãåãããšãèµ·ãããŸãã Flutterã¯ElementTreeãšããã«å¯Ÿå¿ããç¶æ
ã䜿çšããŠãå®éã«ããã€ã¹ã«è¡šç€ºãããã®ã決å®ãããããç§ãã¡ã®èгç¹ããã¯ããŠã£ãžã§ããã¯äº€æãããŠããªãããã§ãïŒ

ã³ã³ã¹ãã©ã¯ã¿ãŒã«ç¶æ
ãæã€è²ä»ããŠã£ãžã§ããã®ã³ãŒãã®ä¿®æ£ããŒãžã§ã³ã§ã¯ã key
ããããã£ãå®çŸ©ããŸããã ããã§ã Row
ã®ãŠã£ãžã§ããã倿Žãããšãã¿ã€ãããšã«ä»¥åãšåãããã«äžèŽããŸãããã«ã©ãŒãŠã£ãžã§ãããšElementTreeã®å¯Ÿå¿ããèŠçŽ ã®key
å€ã¯ç°ãªããŸãã ããã«ãããFlutterã¯ã«ã©ãŒãŠã£ãžã§ããã®ãããã®èŠçŽ ãéã¢ã¯ãã£ãåããElementTreeã§ãããã®èŠçŽ ãžã®ãªã³ã¯ãåé€ããŸããæåã®key
ã¯key
äžèŽããŸããã

ãã®åŸãFlutterã¯ã察å¿ããkey
ã䜿çšããŠElementTreeã®Row
èŠçŽ ã§ãŠã£ãžã§ãããæ€çŽ¢ãkey
ã äžèŽããå ŽåããŠã£ãžã§ããèŠçŽ ã«ãªã³ã¯ã远å ããŸãã Flutterã¯ããªã³ã¯ã®ãªãååã«å¯ŸããŠè¡ããŸãã ããã§Flutterã«æåŸ
ã©ããã®çµæã衚瀺ããããã¿ã³ãã¯ãªãã¯ãããšã«ã©ãŒãŠã£ãžã§ããã®å Žæãå€ãããŸãã
ãããã£ãŠã keys
ã¯ãã³ã¬ã¯ã·ã§ã³å
ã®ç¶æ
ã§ãŠã£ãžã§ããã®é åºãŸãã¯æ°ã倿Žããå Žåã«åœ¹ç«ã¡ãŸãã ãã®äŸã§ã¯ãè²ãä¿åããŸããã ãã ããå€ãã®å Žåãç¶æ
ã¯ããã»ã©æçœã§ã¯ãããŸããã ã¢ãã¡ãŒã·ã§ã³ã®åçããŠãŒã¶ãŒå
¥åã®è¡šç€ºãå Žæã®ã¹ã¯ããŒã«ãªã©ããã¹ãŠã®ç¶æ
ããããŸãã
ãã€keys
ã䜿çšããå¿
èŠãããkeys
ãïŒ
ç°¡åãªçãïŒ keys
ãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããå¿
èŠãããå Žåã¯ãä¿åãããç¶æ
ã®ãŠã£ãžã§ãããµãããªãŒã®äžéšã«keys
ã远å ããå¿
èŠããããŸãã
ç§ãèŠãããããééãã¯ãç¶æ
ãæã€æåã®ãŠã£ãžã§ããã«å¯ŸããŠã®ã¿key
ãå®çŸ©ããå¿
èŠããããšäººã
ãèããããšã§ããããã¥ã¢ã³ã¹ããããŸãã ä¿¡ããããªãïŒ ã©ã®ãããªåé¡ãããã®ãââã瀺ãããã«ãã«ã©ãŒãŠã£ãžã§ããã®ããŒãæ®ãããŸãŸãã«ã©ãŒãŠã£ãžã§ãããPadding
ãŠã£ãžã§ããã§ã©ããããŸããã
void main() => runApp(new MaterialApp(home: PositionedTiles())); class PositionedTiles extends StatefulWidget { @override State<StatefulWidget> createState() => PositionedTilesState(); } class PositionedTilesState extends State<PositionedTiles> {
ä»ããã¿ã³ã«è§Šããã ãã§ããŠã£ãžã§ããã¯å®å
šã«ã©ã³ãã ãªè²ã«ãªããŸãïŒ

ããã¯ã远å ãããPadding
ãŠã£ãžã§ããã䜿çšãããŠã£ãžã§ããããªãŒãšElementTreeã®å€èгã§ãã

åãŠã£ãžã§ããã®äœçœ®ã倿ŽãããšãèŠçŽ ãšãŠã£ãžã§ããéã®ãããã³ã°ã¢ã«ãŽãªãºã ã¯ãèŠçŽ ã®ããªãŒã®1ã€ã®ã¬ãã«ã«èŠããŸãã å³ã§ã¯ãåã®åãæããããŠãããããæåã®ã¬ãã«ããäœãéªéãããŸããã ãã®ã¬ãã«ã§ã¯ããã¹ãŠãæ£ããäžèŽããŸãã

2çªç®ã®ã¬ãã«ã§ã¯ãFlutter key
colorèŠçŽ ã®key
ãŠã£ãžã§ããã®key
äžèŽããªãããšã«æ°ã¥ãããããã®èŠçŽ ãéã¢ã¯ãã£ãåããç Žæ£ããŠããã¹ãŠã®ãªã³ã¯ãåé€ããŸãã ãã®äŸã§äœ¿çšããkeys
ã¯LocalKeys
ã§ãã ã€ãŸãããŠã£ãžã§ãããèŠçŽ ãšäžèŽããããšãFlutterã¯ããªãŒã®ç¹å®ã®ã¬ãã«ã§ã®ã¿keys
æ€çŽ¢ãkeys
ã
圌ã¯ãã®ã¬ãã«ã§å¯Ÿå¿ããkey
æã€ã«ã©ãŒãŠã£ãžã§ããèŠçŽ ãèŠã€ããããšãã§ããªããããæ°ãããŠã£ãžã§ãããäœæããŠæ°ããç¶æ
ãåæåãããã®å ŽåãŠã£ãžã§ããããªã¬ã³ãžè²ã«ããŸãïŒ

Padding
ãŠã£ãžã§ããã®keys
ãå®çŸ©ããå ŽåïŒ
void main() => runApp(new MaterialApp(home: PositionedTiles())); class PositionedTiles extends StatefulWidget { @override State<StatefulWidget> createState() => PositionedTilesState(); } class PositionedTilesState extends State<PositionedTiles> { List<Widget> tiles = [ Padding(
Flutterã¯åé¡ãèªèããåã®äŸã®ããã«ãªã³ã¯ãæ£ããæŽæ°ããŸãã ãŠãããŒã¹ã®é åºã埩å
ãããŸãã

ã©ã®ã¿ã€ãã®Key
ã䜿çšããå¿
èŠããããŸããïŒ
Flutter APIã«ãããããã€ãã®Key
ã¯ã©ã¹ãéžæã§ããŸããã 䜿çšãã¹ãkey
ã®ã¿ã€ãã¯ã key
ãå¿
èŠãšããèŠçŽ ã®ç¹åŸŽçãªæ©èœã«ãã£ãŠç°ãªãkeys
ã ããããã®ãŠã£ãžã§ããã«ä¿åããæ
å ±ãèŠãŠãã ããã
次ã®To-doã¢ããªã±ãŒã·ã§ã³[1]ãæ€èšããŠãã ãããããã§ã¯ãåªå
床ã«åºã¥ããŠã¿ã¹ã¯ãªã¹ãå
ã®ã¢ã€ãã ã®é åºã倿Žã§ããå®äºãããåé€ã§ããŸãã

ValueKey
ãã®å Žåãå®è¡ããã¢ã€ãã ã®ããã¹ãã¯æ°žç¶çã§äžæã§ããããšãäºæ³ãããŸãã ãããããªããããã¯ããããããã¹ãããå€ãã§ããValueKey
è¯ãåè£ã§ãã
return TodoItem( key: ValueKey(todo.task), todo: todo, onDismissed: (direction) => _removeTodo(context, todo), );
ãªããžã§ã¯ãããŒ
ãŸãã¯ãåãŠãŒã¶ãŒã«é¢ããæ
å ±ãäžèŠ§è¡šç€ºããã¢ãã¬ã¹åž³ã¢ããªã±ãŒã·ã§ã³ã䜿çšããããšãã§ããŸãã ãã®å ŽåãååãŠã£ãžã§ããã«ã¯ãããè€éãªããŒã¿ã®çµã¿åãããæ ŒçŽãããŸãã ååãèªçæ¥ãªã©ã®åã
ã®ãã£ãŒã«ãã¯å¥ã®ãšã³ããªãšäžèŽããå ŽåããããŸãããçµã¿åããã¯äžæã§ãã ãã®å Žåã ObjectKey
ãæé©ã§ãã

ãŠããŒã¯ããŒ
ã³ã¬ã¯ã·ã§ã³ã«åãå€ãæã€è€æ°ã®ãŠã£ãžã§ãããããå ŽåããŸãã¯åãŠã£ãžã§ãããä»ã®ãã¹ãŠã®ãŠã£ãžã§ãããšç°ãªãããšãæ¬åœã«ç¢ºèªãããå Žåã¯ã UniqueKey
ã䜿çšã§ããŸãã ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§è²ãåãæ¿ããããã«UniqueKey
ã䜿çšããŸããã UniqueKey
ã¯ããŠã£ãžã§ããã«æ ŒçŽãããä»ã®å®æ°ããŒã¿ãââãªããäœææã«ãŠã£ãžã§ããã®è²ãããããªãããã§ãã
ãã ãã key
ãšããŠäœ¿çšããããªãã®ã¯ä¹±æ°ã§ãã ãŠã£ãžã§ãããäœæããããã³ã«ãæ°ããä¹±æ°ãçæããããã¬ãŒã éã®äžè²«æ§ã倱ãããŸãã ãã®ã·ããªãªã§ã¯ã keys
ããŸã£ãã䜿çšã§ããŸããïŒ
PageStorageKeys
PageStorageKeys
ã¯ãã¹ã¯ããŒã«ã®çŸåšã®ç¶æ
ãå«ãç¹æ®ãªkeys
ãããããã¢ããªã±ãŒã·ã§ã³ã¯åŸã§äœ¿çšããããã«ä¿åã§ããŸãã

ã°ããŒãã«ããŒ
GlobalKeys
ã䜿çšããããã®2ã€ã®ãªãã·ã§ã³ããããŸãããŠã£ãžã§ããã䜿çšãããšãç¶æ
ã倱ãããšãªãã¢ããªã±ãŒã·ã§ã³å
ã®ä»»æã®å Žæã§èŠªã倿Žã§ãããŠã£ãžã§ããããªãŒã®ãŸã£ããç°ãªãéšåã®å¥ã®ãŠã£ãžã§ããã«é¢ããæ
å ±ã«ã¢ã¯ã»ã¹ã§ããŸãã æåã®ã·ããªãªã®äŸãšããŠã2ã€ã®ç°ãªãç»é¢ã«åããŠã£ãžã§ããã衚瀺ãããããåãç¶æ
ã§ãŠã£ãžã§ããããŒã¿ãä¿åããããã«GlobalKey
ã䜿çšããããšãGlobalKey
ãŸãã 2çªç®ã®ã±ãŒã¹ã§ã¯ããã¹ã¯ãŒãã確èªããå¿
èŠãããããããªãŒå
ã®ä»ã®ãŠã£ãžã§ãããšã¹ããŒã¿ã¹æ
å ±ãå
±æããããªãå ŽåããããŸãã GlobalKeys
ã¯ã key
ã䜿çšããŠç¹å®ã®ãŠã£ãžã§ããã«ã¢ã¯ã»ã¹ãããã®ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãèŠæ±ãããã¹ãã«ã圹ç«ã¡ãŸãã

å€ãã®å ŽåïŒåžžã«ã§ã¯ãããŸããïŒïŒã GlobalKeys
ã°ããŒãã«å€æ°ã«å°ã䌌ãŠããŸãã å€ãã®å Žåããããã¯InheritedWidgets
ãŸãã¯Reduxã®ãããªãã®ããŸãã¯BLoCãã³ãã¬ãŒãã«çœ®ãæããããšãã§ããŸãã
ç°¡åãªçµè«
äžè¬ã«ããŠã£ãžã§ããã®ãµãããªãŒéã§ç¶æ
ãç¶æããå Žåã¯ã Keys
䜿çšããŸãã ããã¯ãåãã¿ã€ãã®ãŠã£ãžã§ããã®ã³ã¬ã¯ã·ã§ã³ã倿Žãããšãã«æãããèµ·ãããŸãã ä¿åãããŠã£ãžã§ãããµãããªãŒã®äžéšã«key
ãé
眮ãããŠã£ãžã§ããã«ä¿åãããŠããããŒã¿ã«åºã¥ããŠkey
ã¿ã€ããéžæããŸãã
ããã§ãšãããããŸããããã§ãã©ãã¿ãŒã¡ã€ãžã«ãªããŸãïŒ ãããããžã·ã£ã³ãšèšã£ãïŒ ç§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒããæžã人ã®ãããªéè¡åž«[2]ãæå³ããŸããã ...ã»ãšãã©ã
[1]ããã§åãåã£ãTo-doã¢ããªã±ãŒã·ã§ã³ã³ãŒããæžãããã®ã€ã³ã¹ãã¬ãŒã·ã§ã³
https://github.com/brianegan/flutter_architecture_samples/tree/master/vanilla
[2]äœè
ã¯sorcerer
ãšããèšèã䜿çšããåŸã§sourcerer
åã«è¿œå ã®æåã远å ããŸã