component를 통해서 class의 state가 관리되는 형태의 플러터는, 자식컴포넌트들 간의 데이터를 주고 받는 과정에서 불필요한 이동을 줄이고 비즈니스 로직과 위젯을 분리하기 위해서 필요로 한다.
가장 널리 쓰이는 상태관리 솔루션, Google에서 개발되었으며, UI와 Bussiness Logic을 분리하여서 의존성을 낮춘다.
장점
단점
장점
단점
장점
단점
장점
단점
단점
장점
단점
장점
단점
공유하고자 하는 Data를 전역변수로 선언해서 사용한다.
class CountBloc {
int _count = 0; // 상태
final StreamController<int> _countSubject = StreamController<int>.broadcast(); // Stream 생성
Stream<int> get count => _countSubject.stream; // 구독자들에게 변경 사항 전송
add() {
_count++;
_countSubject.sink.add(_count); // 이벤트를 받아 stream에 상태 변경 추가
}
}
return Center(
child: StreamBuilder(
stream: countBloc.count, //<--stream 들 중에서 countBloc.count 값 구독
initialData: 0,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data.toString());
}
return CircularProgressIndicator();
},
),
);
Provider을 선언하면서, Provider에 속한 자녀들은 전부 Provider에 접근이 가능하다.
단, 상위 Widget은 하위 위젯의 Provider에 접근이 불가능 하다.
MaterialApp(
title: 'Flutter Demo',
home: MultiProvider(
providers: [
ChangeNotifierProvider(
create: (BuildContext context) => CounterProvider())
],
child: Home(),
),
);
- ChangeNotifier 상속받아 notifyListeners() 상태 변경 사항을 알림.
class CounterProvider extends ChangeNotifier {
int _count = 0; // 상태
add() {
_count++; //상태 변경
notifyListeners(); // 상태 변경 된 것을 알림
}
}