2021.06.16 - [Usage/Flutter] - [Flutter] Bloc Pattern (stateful -> bloc -> skip event bloc )
Install package
https://pub.dev/packages/provider
Project 구조
main.dart
src
- count_home.dart
- count_provider.dart
- count_home_widget.dart // statelesswidget
main.dart
void main() {
runApp(MyApp());
// runApp에서 provider를 불러오면 MyApp에서 접근 가능
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MultiProvider(
providers: [
ChangeNotifierProvider(
create: (BuildContext context) => CounterProvider())
],
// child의 모든 하위 요소들은 CounterProvider에 접근 가능
child: Home(),
),
// home: ChangeNotifierProvider(
// create: (BuildContext context) => CounterProvider(),
// child: Home(),
// ),
);
}
count_provider.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// ChangeNotifier 상속
// bloc 에서 stream 처리, sink 주입 했던 것을 처리해줌
class CounterProvider extends ChangeNotifier {
// private
// 이곳에서 선언되는 모든 변수는 상태관리 대상
int _count = 0;
// get 함수를 사용해서 private한 변수에 접근 가능하도록 만듦
int get count => _count;
add() {
_count++;
// 상태값이 update 되었다는 신호를 보내줌
notifyListeners();
}
subtract() {
_count--;
notifyListeners();
}
}
count_home.dart
class Home extends StatelessWidget {
const Home({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
// Provider.of로 사용할 provider를 가져옴
// listen을 false로 해주면 현재의 widget은 rebuilding이 안됨
CounterProvider countProvider =
Provider.of<CounterProvider>(context, listen: false);
return Scaffold(
appBar: AppBar(
title: Text("Provider"),
),
body: CountView(),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
IconButton(
icon: Icon(Icons.add),
onPressed: () => countProvider.add(),
),
IconButton(
icon: Icon(Icons.remove),
onPressed: () => countProvider.subtract(),
),
],
),
);
}
count_home_widget.dart
class CountView extends StatelessWidget {
const CountView({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: Text(
// Provider.of를 통해 접근해서 count값 가져옴
// build 전체를 rebuilding 함
Provider.of<CounterProvider>(context).count.toString(),
),
);
}
}
// 특정 위젯만 rebuilding
class CountView extends StatelessWidget {
const CountView({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
// consumer를 사용해서 특정 위젯만 rebuilding
child: Consumer<CounterProvider>(
builder: (context, provider, child) {
return Text(
provider.count.toString(),
);
}),
);
}
}
참고
https://www.youtube.com/watch?v=AmmjdvhQG1s
728x90
'Study > Flutter' 카테고리의 다른 글
[Flutter] Factory 패턴 (0) | 2021.07.13 |
---|---|
[Flutter] Stateful widget (0) | 2021.06.14 |
[UI초급] Container, materialApp, Scaffold (0) | 2021.06.07 |