import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Person with ChangeNotifier {
late String name;
late int age;
Person( this.name, this.age);
// when `notifyListeners` is called, it will invoke
// any callbacks that have been registered with an instance of this object
// `addListener`.
void increaseAge() {
age++;
print('increaseAge : $age');
notifyListeners();
}
}
void main() {
runApp(MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => Person('iljin', 45),
),
],
child: MyHomePage(),
));
// var person = Person('iljin', 45);
// `addListener` is a method on the `ChangeNotifier` class,
// which is mixed-in to the Person class
// person.addListener(() {
// print('value updated!: ${person.age}');
// });
// person.increaseAge();
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home:Scaffold(
appBar: AppBar(
title: const Text('Provider Class'),
),
body: Center(
child: Text(
'''
Hi ${Provider.of<Person>(context).name}!
You are ${Provider.of<Person>(context).age} years old''',
/* 위젯 트리에서 가장 가까운 Provider<T>를 가져오고 해당 값을 반환합니다.
listen이 true이면 나중에 값을 변경하면 위젯에 대한 새 State.build가 트리거되고
StatefulWidget에 대한 State.didChangeDependencies가 트리거됩니다.
listen: State.initState 내부에서 Provider.of를 호출하거나
다음과 같이 제공자의 create 메소드를 호출하려면 false가 필요합니다.
Provider(
create: (context) {
return Model(Provider.of (context, listen: false)),
},
)
*/
),
),
floatingActionButton: FloatingActionButton(
child: const Text('+'),
onPressed: () =>
Provider.of<Person>(context, listen: false).increaseAge(),
/*
플로팅 버튼이 탭되었을때 Person.increaseApp() 함수가 호출되면
person의 인스턴스는 provider에 의해 생성된다.
*/
),
),
);
}
}