Для этого вы можете использовать GlobalKey
. GlobalKey
используются для идентификации указанного c виджета в дереве виджетов.
Пример использования:
В файле FirstWidget.dart:
class FirstWidget extends StatefulWidget {
@override
FirstWidgetState createState() => FirstWidgetState();
}
// Make sure your FirstWidgetState class is not private!
class FirstWidgetState extends State<FirstWidget> {
bool _isDisabled = true;
void enable(bool value) {
setState(() => _isDisabled = !value);
}
@override
Widget build(BuildContext context) {
return Container(
// Doing Something with the flag isDisabled
);
}
}
В файле SecondWidget.dart (я немного изменил этот файл, чтобы показать использование GlobalKey
):
final GlobalKey<FirstWidgetState> firstWidgetGlobalKey = new GlobalKey<FirstWidgetState>();
class SecondWidget extends StatefulWidget {
@override
_SecondWidgetState createState() => _SecondWidgetState();
}
class _SecondWidgetState extends State<SecondWidget> {
@override
Widget build(BuildContext context) {
return Container(
child: Column(
children: <Widget>[
FirstWidget(
key: firstWidgetGlobalKey,
),
RaisedButton(
onPressed: () {
firstWidgetGlobalKey.currentState.enable(true);
},
child: Text("Enable First Widget"),
),
],
),
);
}
}
EDIT
Экземпляр GlobalKey
должен быть уникальным во всем приложении. Поэтому более разумный способ использовать глобальные ключи - хранить их все в отдельном файле (например, keys.dart
). В этом файле вы можете иметь firstWidgetGlobalKey
и secondWidgetGlobalKey
в качестве конечных переменных и просто импортировать файл для их использования.
Недостатком (но это предполагаемое поведение) является то, что GlobalKey
может только будет использоваться, когда идентифицируемый виджет в настоящее время присутствует в дереве виджетов , в противном случае вы получите нулевую ссылку на currentState
.
Другой способ получить доступ к состоянию виджета из другой - использовать InheritedWidget . Так как это требует больше усилий, есть большое и простое руководство, показывающее использование: InheritedWidget Tutorial на Medium .
Надеюсь, это поможет!