Flutter ChangeNotifier personal note
Kegunaan
ChangeNotifier digunakan untuk menyimpan app state. ChangeNotifier memberikan Observer Pattern dimana kita bisa meng-“subscribe” widget untuk mendapatkan update ketika terjadi perubahan state.
ChangeNotifier class
Sebagai contoh, anggap kita ingin menyimpan state berapa kali seorang user menekan sebuah button di app menggunakan sebuah class. Kita namakan class tersebut sebagai CounterModel
:
import 'package:provider/provider.dart';
class CounterModel extends ChangeNotifier {
int counter = 0;
void inc() {
counter += 1;
notifyListeners();
}
}
Beberapa hal yang perlu diperhatikan:
- Harus meng-import package
provider/provider.dart
- Class yang akan menyimpan state tersebut harus meng-extend ChangeNotifier
notifyListeners()
harus dipanggil jika kita ingin memberitahu semua widget yang subscribe bahwa telah terjadi perubahan state.
Menghubungkan widget dengan state
Agar dapat menggunakan state object di dalam widget, kita perlu membungkus widget tersebut di dalam class Consumer<YourClass>
. Sebagai contoh, jika kita ingin menghubungkan sebuah tombol ke state diatas:
class MyButton extends StatefulWidget {
const MyButton({super.key});
@override
State<MyButton> createState() => MyButtonState();
}
class MyButtonState extends State<MyButton> {
@override
Widget build(BuildContext context) {
return Consumer<CounterModel>(
builder: (context, notifier, child) =>
ElevatedButton(
onPressed: () => {
notifier.inc()
},
child: const Text('I like this button'),
)
);
}
}
Dapat kita lihat bahwa method build
dari class MyButton
mengembalikan widget Consumer<CounterModel>
yang didalamnya berisi sebuah tombol. Tombol tersebut akan memanggil method inc()
di dalam object dari class CounterModel
.
Selanjutnya, widget yang memiliki tipe Consumer<T>
hanya bisa di-instansiasi menggunakan ChangeNotifierProvider
. Ini disebabkan widget tersebut harus terhubung dengan suatu object ChangeNotifier
. Sehingga, untuk menggunakan widget MyButton
:
ChangeNotifierProvider(
create: (context) => CounterModel(),
child: const MyButton(),
),
Perhatikan bahwa kamu tidak bisa meng-instansiasi MyButton
tanpa menghubungkannya dengan sebuah object CounterModel
. Jika dilakukan, maka akan mendapatkan error ProviderNotFoundException