Я работаю над 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: '',
),
И вот картинка, как это выглядит:
Возможно, из-за ClipRRect.
попробуйте уменьшить (или удалить) радиус границы ClipRRect
, если это все еще происходит, попробуйте обернуть Icon()
Container
и поставить ему color
, чтобы увидеть, не кроется ли причина в значке
Это не проблема для большинства панелей навигации, поскольку ожидается, что они просто опускаются вниз. Однако ваш случай немного усложняет ситуацию.
Что вам нужно сделать, это удалить 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
.
Попробуйте удалить внешние отступы и явные размеры.