Добавить функцию обратного вызова в BottomNavigationBarItem Flutter - PullRequest
0 голосов
/ 17 января 2020

В настоящее время у меня есть приложение, которое содержит навигацию по нижней вкладке, и я хочу, чтобы пользователь мог перемещаться по любой странице, к которой был нажат. В настоящее время я работаю со страницей поиска, где пользователь может 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),
                        ),
                      ),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ],
    ),
  },
},

1 Ответ

0 голосов
/ 17 января 2020

Я думаю, вы можете сделать это в вашем методе _onTapHandler, как.

void _onTapHandler(int index) {
  // assuming index 1 is your search tab
  if(index == 1) {
    showSearch(
      context: context,
      delegate: SearchFieldDelegation(),
    );
  } else {
    setState(() {
      _selectedIndex = index;
    });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...