android - 颤振:将 FAB 点击监听器传递给 Tabbar 小部件
问题描述
我有一个带有标签栏和 FAB 按钮的主屏幕。我需要将 FAB 点击监听器传递给我的标签栏小部件。但我找不到任何方法来实现这一目标。我是新来的。有人,请帮我找出解决方案。
这是我HomeScreen
的标签栏,我想将 FAb 的点击传递给MyContactTab.dart
...
child: TabBarView(
children: [
ChatTab().buildChatScreen(),
GroupTab().buildGroupScreen(),
MyContactsTab(permissionStatus: _permissionStatus)
],
controller: _tabController,
),
...
floatingActionButton: FloatingActionButton(
onPressed: () {
//should call MyContactTab's onRefreshClick()
},
child: Icon(
Icons.sync,
),
),
这是MyContactTab.dart
class MyContactsTab extends StatefulWidget {
final PermissionStatus permissionStatus;
MyContactsTab({Key key, @required this.permissionStatus});
@override
State<StatefulWidget> createState() {
return MyContactState(permissionStatus);
}
}
class MyContactState extends State<MyContactsTab>
with AutomaticKeepAliveClientMixin<MyContactsTab> {
void onRefreshClick() {
//todo refresh contacts
}
...
}
解决方案
最简洁的方法是使用 Model-View-Controller 变体之一。flutter_bloc包是一个流行的选择。它本质上将模型分解为多个块。您可以通过 FAB 构建上下文获取一个块的句柄。您可以在 FAB 和 MyContactTab 上方的小部件树中注册 bloc。在 FAB onPressed() 回调中,您通过上下文检索 bloc,然后使用它来更新 MyContactTab 使用的状态。MyContactTab 的 build 方法可以侦听 bloc 状态更新并在响应中重建。
这可能看起来很复杂,但它是干净且可维护的。您也许可以使用 GlobalKeys 从 FAB 获取特定小部件的句柄,但是在具有不确定生命周期的小部件之间传输状态并不容易推理或维护。
推荐阅读
- css - 我想更简洁地替换对角线方向的计算
- java - 为什么孩子被夹在自定义吐司中?
- javascript - Javascript - 当用户到达某个点时暂停用户滚动
- python - ImportError:DLL 加载失败:在 Windows 10 上找不到指定的过程错误
- angular - AWS API Gateway WebSocket 连接错误 - 超时
- java - ManyToOne 为每个新对象在两个表中创建新条目
- jquery - 自动完成在动态输入字段中不起作用
- amazon-web-services - 无法连接来自 Athena 中两个不同数据库的两个表
- python - 将 tkinter 中的 ProgressBar 增加 x 输入的数量
- mysql - 如何在laravel中翻译这个mysql代码