В настоящее время у меня есть приложение, которое содержит навигацию по нижней вкладке, и я хочу, чтобы пользователь мог перемещаться по любой странице, к которой был нажат. В настоящее время я работаю со страницей поиска, где пользователь может go войти и щелкнуть по полю поиска, в котором он может перевести их в ящик, где они могут ввести свой поисковый ввод с помощью метода showSearch (), который передается в обратный вызов onTap в моем виджете TextField.
В дополнение к возможности выбора самого текстового поля я также хочу, чтобы этот ящик showSearch () отображался по умолчанию, когда пользователь нажимает на значок поиска, расположенный в навигационной панели «Нижняя вкладка». Проблема заключается в том, что виджет BottomNavigationBarItem не принимает никаких функций обратного вызова в качестве аргумента.
В дальнейшем я планирую перенастроить свой BottomNavigationBar для приема виджетов IconButton, которые принимают функции обратного вызова.
Мой вопрос: как мне сделать так, чтобы я мог передать метод showSearch () в реальный значок поиска, расположенный в навигационной панели «Моя вкладка», чтобы он выполнял те же функции, что и панель поиска?
Виджет навигации по нижней вкладке
class BottomTabNavigation extends StatefulWidget {
@override
_BottomTabNavigationState createState() => _BottomTabNavigationState();
}
class _BottomTabNavigationState extends State<BottomTabNavigation> {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
int _selectedIndex = 0;
final List<Widget> _children = [
PracticionerMainView(),
PracticionerSearchView(),
PracticionerProfileView(),
];
void _onTappedHandler(int index) {
setState(() {
_selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: HealthHubAppBar(
scaffoldKey: _scaffoldKey,
),
drawer: HealthHubDrawer(),
body: _children[_selectedIndex],
bottomNavigationBar: BottomNavigationBar(
onTap: _onTappedHandler,
currentIndex: _selectedIndex,
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.home),
title: Text('User'),
),
BottomNavigationBarItem(
icon: Icon(Icons.search),
title: Text('Search'),
),
BottomNavigationBarItem(
icon: Icon(Icons.person_outline),
title: Text('My Appointments'),
),
],
selectedItemColor: Colors.blue[200],
),
);
}
}
Виджет просмотра поиска
class SearchFieldDelegation extends SearchDelegate {
@override
List<Widget> buildActions(BuildContext context) {
return [
IconButton(
icon: Icon(Icons.clear),
onPressed: () {
query = '';
},
),
];
}
@override
Widget buildLeading(BuildContext context) {
return IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
close(context, null);
},
);
}
@override
Widget buildResults(BuildContext context) {
return Column();
}
@override
Widget buildSuggestions(BuildContext context) {
return Column();
}
}
class PracticionerSearchView extends StatefulWidget {
@override
_PracticionerSearchViewState createState() => _PracticionerSearchViewState();
}
class _PracticionerSearchViewState extends State<PracticionerSearchView> {
TextEditingController _handleSearchEdit = TextEditingController();
String searchEntry;
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Expanded(
child: ListView(
children: <Widget>[
Center(
child: Container(
padding: EdgeInsets.all(25.0),
child: TextField(
onTap: () {
showSearch(
context: context,
delegate: SearchFieldDelegation(),
);
},
decoration: InputDecoration(
labelText: 'Search',
hintText: 'Search Practitioners',
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(
borderRadius: BorderRadius.all(
Radius.circular(25.0),
),
),
),
),
),
),
],
),
),
],
),
},
},