flutter - Flutter - 从另一个有状态小部件设置一个有状态小部件的变量值
问题描述
我是 Flutter 的新手,这可能是一个非常棘手的问题,但我想从另一个 Stateful 小部件设置一个有状态小部件的变量状态。
分享一个重现问题的小片段。
FirstWidget.dart
class FirstWidget extends StatefulWidget {
@override
_FirstWidgetState createState() => _FirstWidgetState();
}
class _FirstWidgetState extends State<FirstWidget> {
bool _isDisabled = true;
@override
Widget build(BuildContext context) {
return Container(
// Doing Something with the flag isDisabled
);
}
}
SecondWidget.dart
class SecondWidget extends StatefulWidget {
@override
_SecondWidgetState createState() => _SecondWidgetState();
}
class _SecondWidgetState extends State<SecondWidget> {
@override
Widget build(BuildContext context) {
return Container(
// Here I want to update the isDisabled Flag of the First Widget.
);
}
}
我基本上只是想知道如何从另一个小部件更新一个小部件的变量值。
谢谢
解决方案
为此,您可以使用GlobalKey
. GlobalKey
用于标识小部件树中的特定小部件。
使用示例:
在 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"),
),
],
),
);
}
}
编辑
一个GlobalKey
实例在整个应用程序中是唯一的。因此,使用全局键的一种更聪明的方法是将它们全部存储在一个单独的文件中(例如 . keys.dart
)。在此文件中,您可以将firstWidgetGlobalKey
和secondWidgetGlobalKey
作为最终变量,只需导入文件即可使用它们。
一个缺点(但这是一种预期的行为)是 aGlobalKey
只能在它识别的小部件当前存在于小部件树中时使用,否则您将在 上获得空引用currentState
。
从另一个小部件访问小部件状态的另一种方法是使用InheritedWidget。由于它需要更多的努力,因此有一个很棒且简单的教程来展示用法:InheritedWidget Tutorial on Medium。
希望这会有所帮助!
推荐阅读
- javascript - vue如何让v-for返回一个词加上前一个词
- c# - 使用 Open XML SDK 更新页眉和页脚中的内容控制文本
- linux - 无法在 Linux 中打开目录,但我绝对可以“ls”显示它
- python - 我可以在 Django 中使多个子模型“可爱”吗?
- bash - 使用 AWK 计算文件中特定字母的比例
- php - Microsoft Graph API(日历)间歇性 503 错误
- asp.net-core - 有什么方法可以离线使用 NToasNotify 吗?
- flutter - 无效的 radix-10 数字(在字符 1 处)//flutter-update-4bb0a-default-rtdb.firebaseio.com/ ^
- python-3.x - 如何使用 numpy 和 python 计算小批量 SGD?
- javascript - OpenLayers 中的卫星视图 - 如何设置?