Нижняя панель навигации занимает большую высоту на некоторых устройствах во Flutter

Я работаю над BottomNavigationBar в своем приложении Flutter, но заметил, что на некоторых телефонах он занимает больше высоты, например на некоторых Iphone, Samsung Galaxy S23 и т. д. Я пытаюсь поместить контейнер или SizeBox с заранее определенной высотой, но ничего не меняется. У кого-нибудь есть решение?

Вот код:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: tdWhite,
      bottomNavigationBar: Padding(
        padding: const EdgeInsets.all(8),
        child: ClipRRect(
            borderRadius: BorderRadius.circular(100),
            child: BottomNavigationBar(
              type: BottomNavigationBarType.fixed,
              backgroundColor: tdWhiteNav,
              showSelectedLabels: false,
              showUnselectedLabels: false,
              onTap: (int newIndex) {},
              items:const [
                BottomNavigationBarItem(
                  icon:  Icon(MyFlutterApp.home, color: tdIconColor),
                  label: '',
                ),
                BottomNavigationBarItem(
                  icon:  Icon(MyFlutterApp.ticket, color: tdIconColor, size: 40),
                  label: '',
                ),
                BottomNavigationBarItem(
                  icon:   Icon(MyFlutterApp.group_168, color: tdBlack, size: 40),
                  label: '',
                ),
                BottomNavigationBarItem(
                  icon:  Icon(MyFlutterApp.profile, color: tdIconColor),
                  label: '',
                ),

И вот картинка, как это выглядит:

Попробуйте удалить внешние отступы и явные размеры.

Basit Ali 05.05.2024 17:02

Возможно, из-за ClipRRect.

Patrick 05.05.2024 18:00

попробуйте уменьшить (или удалить) радиус границы ClipRRect, если это все еще происходит, попробуйте обернуть Icon()Container и поставить ему color, чтобы увидеть, не кроется ли причина в значке

Adan 06.05.2024 05:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не проблема для большинства панелей навигации, поскольку ожидается, что они просто опускаются вниз. Однако ваш случай немного усложняет ситуацию.

Что вам нужно сделать, это удалить viewPadding, который BottomNavigationBar использует, чтобы определить, сколько отступов нужно добавить к его нижней части.

Это должно сделать это:

return Scaffold(
  ...
  bottomNavigationBar: Builder(
    builder: (context) {
      final mediaQuery = MediaQuery.of(context);
      return MediaQuery(
        data: mediaQuery.removeViewPadding(
          removeBottom: true,
        ),
        child: Padding(
          padding: EdgeInsets.only(
            top: 8,
            right: 8,
            left: 8,
            bottom: 8 + mediaQuery.viewPadding.bottom,
          ),
          child: ClipRRect(
             /// your code as it is here
          ),
        ),
      );
    }
  ),
);
    

Это делает так, что любые виджеты, запрашивающие viewPadding (т. е. BottomNavigationBar), будут видеть ноль вместо того, что было в .viewPadding.bottom. Я также повторно добавил отступы за пределами панели навигации, чтобы они не были закрыты каким-либо пользовательским интерфейсом.

Я бы посоветовал провести рефакторинг всего этого в виджет, и в этом случае Builder вам не понадобится. Это использовалось для того, чтобы доступный context был контекстом скаффолда, а не виджета, в случае, если scaffold вносит какие-либо изменения в MediaQuery - если mediaQuery был получен из контекста вне скаффолда, то это может перезаписать любые изменения.

Следует быть осторожным с тем, что из-за этого есть небольшая вероятность того, что другие функции каркаса (например, показ закусочной) будут выглядеть неправильно - вам следует проверить это, если вы собираетесь их использовать, и если это что-то сломает. возможно, вам придется обернуть весь каркас прокладкой.

И еще: BottomNavigationBar заменен на NavigationBar, что рекомендуется для новых приложений. Я не уверен, что он использует то же самое свойство, он может использовать MediaQuery.padding вместо MediaQuery.viewPadding.

Другие вопросы по теме

Как добавить фон только для значков в нижней панели навигации Android?
(BottomNavigationView) Стиль этого компонента требует, чтобы тема вашего приложения была Theme.AppCompat (или ее потомок)
Как я могу создать такое нижнее представление навигации с помощью плавающей кнопки действия (FAB), содержащей как значок, так и изображение?
NavController.navigate(R.id.tab_dashboard) путается с нижними касаниями. Обычный клик по нижним вкладкам перестает работать
Добавить кольцо вокруг выбранной вкладки в BottomNavigationView
Как отключить обновление пользовательского интерфейса при многократном нажатии на элемент BottomNavigationView android kotlin
Переместить закусочную выше нижнего уровняNavigationView
Как обеспечить правильную маржу по FAB в BottomAppBar kotlin andorid?
Создайте нижнюю навигацию, как в приложении YouTube для Android
Изменить размер значка нижнего навигационного представления, но значок закрывает текст?