Dart & Flutter
[Flutter] setstate 없이 Button 사용
ju_young
2023. 1. 30. 03:01
728x90
ElevatedButton을 클릭하여 값을 바꿀때마다 setstate를 사용하는 경우가 있다. setstate는 refresh & reload를 해주기 때문에 다른 child widget에도 영향을 준다. 예를 들어서 child widget에 random으로 list에 있는 값을 뽑는 함수가 있다면 이 값이 버튼을 누를때마다 바뀌게 된다.
이러한 문제를 해결하기위해 ValueNotifier, ValueListenableBuilder를 사용할 것이다.
먼저 button의 initialize value 값을 정의하기위해 ValueNotifier를 사용한다.
ValueNotifier<String> dropdownValue = ValueNotifier(timeTypeList.first);
- List<String> timeTypeList
그리고 다음과 같이 Button이라고 정의한 method에 ValueListenableBuilder<String>을 사용한다.
ValueListenableBuilder<String> Button(BuildContext context) {
return ValueListenableBuilder<String>(
valueListenable: dropdownValue,
builder: (BuildContext context, String value, Widget? child) {
return ElevatedButton(
onPressed: () {},
child: DropdownButton(
value: value,
items: timeTypeList.map<DropdownMenuItem<String>>(
(String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
},
).toList(),
onChanged: (String? value) {
dropdownValue.value = value!;
},
),
);
});
- valueListenable: 앞서 정의한 ValueNotifier<String> dropdownvalue 를 넣어준다.
- DropdownButton - value: ValueListenableBuilder의 String value 값을 넣어줘야한다.
- onChanged: ValueNotifier<String> dropdownvalue의 내부 value 값을 선택한 값으로 변경해준다.
728x90