flutter: передача прослушивателя щелчков FAB в виджет панели вкладок

#android #flutter #interface #floating-action-button #tabbar

#Android #flutter #интерфейс #плавающая кнопка действия #панель вкладок

Вопрос:

У меня есть домашний экран с кнопками tabbar и FAB. Мне нужно передать прослушиватель щелчков мыши в мой виджет панели вкладок в flutter. Но я не могу найти способ, как этого добиться. Я новичок в flutter. Кто-нибудь, пожалуйста, помогите мне найти решение.

вот моя 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
  }
  ...
}
 

Ответ №1:

Самый простой способ — использовать один из вариантов Model-View-Controller. Пакет flutter_bloc является популярным выбором. По сути, это разбивает модель на блоки. Вы можете получить дескриптор блока через контекст сборки FAB. Вы можете зарегистрировать блок в дереве виджетов над FAB и MyContactTab. В обратном вызове FAB onPressed() вы извлекаете блок через контекст, а затем используете его для обновления состояния, используемого MyContactTab. Метод сборки MyContactTab может прослушивать обновления состояния блока и перестраивать в ответ.

Это может показаться сложным, но оно чистое и поддерживаемое. Возможно, вы сможете что-то сделать с помощью GlobalKeys, чтобы получить дескриптор определенного виджета из FAB, но перенос состояния между виджетами с неопределенным временем жизни нелегко рассуждать или поддерживать.