首页 > 解决方案 > 颤振:将 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
  }
  ...
}

标签: androidflutterinterfacefloating-action-buttontabbar

解决方案


最简洁的方法是使用 Model-View-Controller 变体之一。flutter_bloc是一个流行的选择。它本质上将模型分解为多个块。您可以通过 FAB 构建上下文获取一个块的句柄。您可以在 FAB 和 MyContactTab 上方的小部件树中注册 bloc。在 FAB onPressed() 回调中,您通过上下文检索 bloc,然后使用它来更新 MyContactTab 使用的状态。MyContactTab 的 build 方法可以侦听 bloc 状态更新并在响应中重建。

这可能看起来很复杂,但它是干净且可维护的。您也许可以使用 GlobalKeys 从 FAB 获取特定小部件的句柄,但是在具有不确定生命周期的小部件之间传输状态并不容易推理或维护。


推荐阅读