flutter의 상태관리를 위해 provider를 이용해보자.
StatefulWidget 을 사용해서 setState() 를 통해 상태관리를 한다면 위젯트리 내 다른 위젯이 동일한 값을 사용하기 위해 파라미터로 값을 넘겨 받으면서 사용한다. 여기서 setState() 를 사용하면 경로에 있는 모든 위젯들이 재빌드 된다.
provider 를 사용하면 해당 provider를 사용하고 있는 위젯만 재빌드 되면서 동일한 값을 다 가질 수 있게 된다.
provider 패키지를 설치한다.
provider | Flutter Package
A wrapper around InheritedWidget to make them easier to use and more reusable.
pub.dev
텍스트 필드에 입력된 값을 바로 보여주는 기능을 위한 provider 클래스를 작성한다.
class TextProvider extends ChangeNotifier {
String text = "";
void onChangedText(String text) {
this.text = text;
log(this.text);
notifyListeners();
}
}
ChangeNotifier 를 사용하여 클래스를 생성하면 notifyListeners() 를 사용할 수 있다. notifyListeners() 를 통해 해당 provider를 사용하고 있는 위젯에 변화를 알려줄 수 있다.
여러개의 provider 를 사용하기 위해 최상단 위젯에 MultiProvider 를 이용해서 등록해준다.
class WritePage extends StatelessWidget {
const WritePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(
children: [
Container(
width: double.infinity,
height: 100,
child: Text(context.watch<TextProvider>().text),
),
Container(
decoration: BoxDecoration(
border: Border.all(width: 1)
),
child: TextField(
onChanged: (value) {
context.read<TextProvider>().onChangedText(value);
},
)
),
],
),
);
}
}
provider의 기능 및 값을 사용하기 위해서는 read, watch, select 기능을 사용한다.
read: 상태값만 읽는다. 함수를 호출할 때 많이 사용한다.
watch: 상태값의 변화를 감지하고 나타내준다.
select: 상태값의 특정 부분만 감지하고 나타내준다.
텍스트를 입력받는 페이지를 만들고 provider의 함수과 값을 사용한다.
class WritePage extends StatelessWidget {
const WritePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Column(
children: [
Container(
width: double.infinity,
height: 100,
child: Text(context.watch<TextProvider>().text),
),
Container(
decoration: BoxDecoration(
border: Border.all(width: 1)
),
child: TextField(
onChanged: (value) {
context.read<TextProvider>().onChangedText(value);
},
)
),
],
),
);
}
}
'dev > flutter' 카테고리의 다른 글
파일 다운로드 (0) | 2023.03.22 |
---|---|
[map_app] 현재 위치 마커 (1) | 2023.01.31 |
[map_app] google map (IOS, 안드로이드) (0) | 2023.01.27 |
statusbar 뒤에 이미지 넣기 (0) | 2023.01.25 |
권한 (0) | 2023.01.25 |