import 'package:flutter/material.dart'; /// /// Внешний виджет /// class ExternalWidget extends StatefulWidget { const ExternalWidget({Key? key}) : super(key: key); @override _ExternalWidgetState createState() => _ExternalWidgetState(); } class _ExternalWidgetState extends State { // При инициализации виджета подписываемся на событие изменения // модели myModel. При изменении модели - обновляем ui @override void initState() { myModel.addListener(() { setState(() {}); }); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(myModel.foo), InternalWidget(), ], ), ), ); } } /// /// Внутренний виджет /// class InternalWidget extends StatefulWidget { const InternalWidget({Key? key}) : super(key: key); @override _InternalWidgetState createState() => _InternalWidgetState(); } class _InternalWidgetState extends State { // При инициализации виджета подписываемся на событие изменения // модели myModel. При изменении модели - обновляем ui @override void initState() { myModel.addListener(() { setState(() {}); }); super.initState(); } @override Widget build(BuildContext context) { return Column( children: [ Text(myModel.foo), ElevatedButton( onPressed: onPressed, child: Text('Изменить и текущий и вышестоящий виджет'), ), ], ); } void onPressed() { myModel.foo = 'changed'; } } /// /// Общая модель данных /// class MyModel with ChangeNotifier { String _foo = 'start value'; String get foo => _foo; set foo(String value) { _foo = value; // следующая функция оповестит слушателей о том, что состояние переменной изменилось notifyListeners(); } } final myModel = MyModel();