참고 자료

[Flutter] Key란 무엇인가? (by nakedstrength)


Key는 어떨 때 쓰면 되나요?

<aside> 💡 업데이트되는 StatefulWidget의 하위에 StatefulWidget이 위치할 경우, 하위 StatefulWidget 생성자에 사용하면 됩니다.

</aside>

Key를 올바르게 사용하는 방법은 무엇인가요?

<aside> 🔥 1. 유지해야 하는 상태 정보가 있는 위젯 트리의 최상단에 추가해야 합니다.

</aside>

위 말은 즉, 유지해야 하는 상태 정보가 있는 위젯에 바로 Key를 추가하면, 예상하지 못한 문제를 일으킬 수 있다는 의미입니다.

(예를 들어, 순서가 바뀌는 Widget List가 있다면, Widget List의 각 element에 Key값을 부여하면 됩니다. 이는 Widget List의 각 element에 대한 상태는 유지할 필요가 없지만, 각 element의 하위 Widget에 대해서만 상태 정보를 유지해주면 된다고 하더라도 똑같이 적용됩니다.)

<aside> 💡 2. Key의 종류에 따라 Key를 추가해야 하는 위치가 달라질 수 있습니다.

</aside>

이는 플러터가 Element Tree에서 Key값을 가지고 Widget을 검색할 때, Key의 종류에 따라 검색하는 방식이 달라질 수 있기 때문입니다.

<aside> ⚠️ 3. UniqueKey를 사용할 경우, UniqueKey 생성자는 build 메서드에 위치해서는 안 됩니다.

</aside>

만약 build 메서드 내에 UniqueKey() 생성자가 존재할 경우, 플러터가 화면을 새롭게 그릴 때마다 build 메서드가 실행되고, 그때마다 새로운 Key가 생성됩니다. 이 경우 사실상 Key를 사용하는 이점 자체가 사라지게 됩니다.

이 때문에, UniqueKey를 사용하는 Widget을 생성하는 경우, 해당 Widget 자체를 build 메서드 밖에서 선언하고, 그 Widget 생성자 안에 key값으로 UniqueKey를 주는 방식을 사용하면 됩니다. (보통은 State 코드 안에 바로 전역변수처럼 선언하거나, initState 함수 안에서 생성하는 방식을 사용합니다.)