Класс ChangeNotifier
Класс ChangeNotifier реализует Listenable.
Подписку ведут через
addListener,
снятие через
removeListener,
рассылку через
notifyListeners.
Завершение в
dispose.
Синтаксис
class Bag with ChangeNotifier {
void touch() => notifyListeners();
}
Методы
| Метод | Описание |
|---|---|
addListener |
Регистрирует функцию без аргументов. Давайте разберём вызов на примерах. |
removeListener |
Удаляет ту же функцию, что передали в addListener. Давайте разберём вызов на примерах. |
notifyListeners |
Обходит список из addListener и вызывает каждый VoidCallback. Давайте разберём вызов на примерах.
|
dispose |
Снимает слушателей и помечает объект закрытым. |
Пример
Давайте перестроим Text через ListenableBuilder:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: BagDemo(),
),
),
),
);
}
class TextBag extends ChangeNotifier
{
var line = 'abcde';
void swap()
{
line = line == 'abcde' ? '12345' : 'abcde';
notifyListeners();
}
}
class BagDemo extends StatefulWidget
{
const BagDemo({super.key});
@override
State<BagDemo> createState() => _BagDemoState();
}
class _BagDemoState extends State<BagDemo>
{
final bag = TextBag();
@override
void dispose()
{
bag.dispose();
super.dispose();
}
@override
Widget build(BuildContext context)
{
return Column(
mainAxisSize: MainAxisSize.min,
children: [
ListenableBuilder(
listenable: bag,
builder: (context, child) => Text(bag.line),
),
ElevatedButton(
onPressed: bag.swap,
child: const Text('go'),
),
],
);
}
}
На экране ChangeNotifier сменит подпись между двумя строками.
Пример
Давайте наследуем ValueNotifier от ChangeNotifier:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: ValueEcho(),
),
),
),
);
}
class ValueEcho extends StatelessWidget
{
const ValueEcho({super.key});
@override
Widget build(BuildContext context)
{
final note = ValueNotifier<String>('abcde');
return ValueListenableBuilder<String>(
valueListenable: note,
builder: (context, value, child) {
note.dispose();
return Text(value);
},
);
}
}
На экране ValueNotifier покажет 'abcde' как частный ChangeNotifier.
Смотрите также
-
класс
ValueNotifier,
который хранит одно value -
виджет
ListenableBuilder,
который слушаетChangeNotifier -
метод
notifyListeners,
который запускает перестройку слушателей -
метод
setState,
который обновляетStateбезChangeNotifier