#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, но перенос состояния между виджетами с неопределенным временем жизни нелегко рассуждать или поддерживать.