본문 바로가기
프로그래밍/Flutter-Dart

[Flutter] Provider (1)

by 채연2 2021. 3. 24.

 

 

 

1. Provider

- 하나의 데이터를 여러 페이지에 공유 가능

- 한 클래스는 하나의 역할만 갖도록 분리 가능

- 코드의 간결함

 

 

 

1-1. Provider 데이터 생산


		
Provider<int>.value(
value: 5,
child: MaterialApp(
home: SimplePage(),
),
)

- Provider의 child에서 값 공유 가능

- Provider에서 제공하는 값(value)은 5

 

 

 

1-2. Provider 데이터 소비


		
var data = Provider.of<int>(context);

- Provider.of(context) 또는 Consumer() 위젯 사용하여 소비

 

 

 

2. ChangeNotifierProvider 사용 - 변하는 값 처리

- setState()와 ChangeNotifier는 같은 일을 할 수 있음.

- ㅊChangeNotifier를 mixin한 클래스는 notifyListeners() 함수 호출 가능 → UI 업데이트 가능

 

 

 

2-1. Counter


		
class Counter with ChangeNotifier {
int _counter;
Counter(this._counter);
getCounter() => _counter;
setCounter(int counter) => _counter = counter;
void increment() {
_counter++;
notifyListeners();
}
void decrement() {
_counter--;
notifyListeners();
}
}

- ChangeNotifier를 mixin 했기에 ChangeNotifierProvider 사용해줘야함.

- notifyListeners() : 값이 변할 때마다 flutter framework에 알려줌

 

 

 

2-2. CounterApp


		
class CounterApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Counter>(
// Counter 타입 사용. Counter 클래스의 데이터가 변하는지 보고 있다가 변하면 알려줍니다.
create: (_) => Counter(0),
child: MaterialApp(
title: 'Flutter Value',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
),
);
}
}

- MaterialApp을 ChangeNotifierProvider로 감싸고 있음

- create 속성에서 초기값 정하고 child에 정의된 자식 위젯들에서 사용

 

 

 

2-3. ChangeNotifierProvider 값 사용하기


		
class HomePage extends StatefulWidget {
HomePage({Key? key}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
final counter = Provider.of<Counter>(context);
return Scaffold(
appBar: AppBar(
title: Text("Provider demo"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'${counter.getCounter()}',
style: Theme.of(context).textTheme.display1,
),
RaisedButton(
onPressed: openFirstPage,
child: Text('first page'),
),
RaisedButton(
onPressed: openSecondPage,
child: Text('second page'),
),
],
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FloatingActionButton(
onPressed: counter.increment,
tooltip: 'Increment',
child: Icon(Icons.add),
heroTag: null,
),
SizedBox(
height: 10,
),
FloatingActionButton(
onPressed: counter.decrement,
tooltip: 'Decrement',
child: Icon(Icons.remove),
heroTag: null,
)
],
),
);
}
Future openFirstPage() {
return Navigator.push(
context,
MaterialPageRoute(builder: (context) => FirstPage()),
);
}
Future openSecondPage() {
return Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
}
}

- Provider.of<Counter>(context)로 Counter 타입의 데이터를 가져옴

- onPressed: counter.increment, coutner.decrement에서 값이 증가하거나 감소함.

   ▶ Counter 클래스의 increment(), decrement()에서 notifyListeners() 호출되기에 UI 갱신됨

- Navigator.push 로 화면 이동해도 Counter의 값은 동일함

 

 

 

2-4. FirstPage 에서도 값이 동일한지 확인


		
class FirstPage extends StatefulWidget {
@override
_FirstPageState createState() => _FirstPageState();
}
class _FirstPageState extends State<FirstPage> {
@override
Widget build(BuildContext context) {
final counter = Provider.of<Counter>(context);
return Scaffold(
appBar: AppBar(
title: Text('first page'),
),
body: Center(
child: Container(
child: Text('first page counter ${counter.getCounter()}'),
),
),
);
}
}

- Provider.of<Counter>(context)로 값을 가져옴

 

 

 

2-5. 결과

 

 

 

 

참고 : software-creator.tistory.com/26

 

Flutter - Provider 패턴에 대해서 알아보자

flutter_provider Flutter Provider 패턴이란? Provider란? 데이터 생산과 소비 Provider 써보기 ChangeNotifierProvider로 변하는 데이터 다뤄보기 MultiProvider로 여러 프로바이더 관리하기 Pr..

software-creator.tistory.com

 

 

 

 

320x100

'프로그래밍 > Flutter-Dart' 카테고리의 다른 글

[Flutter] Bluetooth  (0) 2021.03.24
[Flutter] Provider (2)  (0) 2021.03.24
[Flutter] Login App (2)  (0) 2021.03.24
[Flutter] Vlc Player & Circular Percent Indicator  (0) 2021.03.24
[Flutter] Custom Horizontal Number Picker  (0) 2021.03.23

댓글