Flutter: обновление виджета одного класса из другого класса
Задача: в одном из фоново работающих классов (WebSocket клиент) изменилось значение отображаемое в другом классе. Необходимо вызвать setState для изменившегося виджета
Решение: воспользуемся классом StreamController. По сути это «конвеер», в который можно что-то ложить и объявлять «слушателя», который будет что-то делать если в «конвеер» попадет какое-либо значение.
Объявим в глобальных переменных контроллер, «конвеера»:
1 2 |
library me_flutter.globals; var sup_controller = new StreamController<String>.broadcast(); |
Далее в классе ИЗ которого нужно сообщить что что-то изменилось, ложим в «конвеер» данные:
1 |
globals.sup_controller.add("new_message"); |
А в классе, который должен отображать изменения, объявим «слушателя» в initState:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Support extends StatefulWidget { @override _SupportState createState() => _SupportState(); } class _SupportState extends State<Support> { StreamSubscription?subscription; @override void initState() { super.initState(); print("-оформляем подписку.."); subscription = globals.sup_controller.stream.listen((index) { print("чтото пришло!"); setState(() { _scrollDown(); }); }); .... |
Не забудем при выходе из класса, убить подписку:
1 2 3 4 5 6 |
@override void dispose() { print("--отменил подписку.."); subscription?.cancel(); super.dispose(); } |