#flutter #bottom-sheet #flutter-cupertino #flutter-showmodalbottomsheet #cupertinotabbar
#flutter #нижний лист #flutter-Купертино #flutter-showmodalbottomsheet #cupertinotabbar
Вопрос:
Я использую CupertinoTabBar, но хочу показать нижний лист material design, когда пользовательское устройство Android. Однако, когда я использовал их оба, нижний лист скрывается за CupertinoTabBar, как показано ниже.
Не могли бы вы помочь мне исправить это? Или плохо использовать их оба?
Мой упрощенный код
class MyApp extends StatelessWidget {
void onPressed(BuildContext context) async {
await showModalBottomSheet(
context: context,
builder: (context) => Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
title: Text('Delete'),
onTap: () => Navigator.of(context).pop('delete'),
),
Divider(),
ListTile(
title: Text('Cancel'),
onTap: () => Navigator.of(context).pop('cancel'),
)
],
),
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CupertinoTabScaffold(
tabBar: CupertinoTabBar(
items: [
BottomNavigationBarItem(
icon: Icon(Icons.music_note),
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
),
]
),
tabBuilder: (context, index) {
switch (index) {
case 0:
return CupertinoTabView(
builder: (context) {
return CupertinoPageScaffold(
child: FlatButton(
child: Text('button'),
onPressed: () => onPressed(context),
),
);
},
);
case 1:
return CupertinoTabView(
builder: (context) {
return CupertinoPageScaffold(
child: Text('tab 2'),
);
},
);
}
return Container();
}
)
);
}
}
Комментарии:
1. Пожалуйста, проверьте мой ответ, это нормально для вас?
Ответ №1:
Вам просто нужно установить useRootNavigator
значение true
. При этом лист модели будет отображаться поверх всего остального содержимого.
Параметр useRootNavigator гарантирует, что корневой навигатор используется для отображения нижнего листа, когда установлено значение true. Это полезно в случае, когда модальный нижний лист должен отображаться поверх всего остального содержимого, но вызывающий объект находится внутри другого навигатора.
Переработанный код:
void onPressed(BuildContext context) async {
await showModalBottomSheet(
useRootNavigator: true,
context: context,
builder: (context) => Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
title: Text('Delete'),
onTap: () => Navigator.of(context).pop('delete'),
),
Divider(),
ListTile(
title: Text('Cancel'),
onTap: () => Navigator.of(context).pop('cancel'),
)
],
),
);
}
Ответ №2:
Вы можете установить некоторые отступы ниже или установить высоту контейнера для этого. Я редактирую ваш код, устанавливая некоторые отступы, пожалуйста, проверьте это.
class MyApp extends StatelessWidget {
void onPressed(BuildContext context) async {
await showModalBottomSheet(
context: context,
builder: (context) => Padding(
padding: EdgeInsets.fromLTRB(0, 0, 0, 60),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
title: Text('Delete'),
onTap: () => Navigator.of(context).pop('delete'),
),
Divider(),
ListTile(
title: Text('Cancel'),
onTap: () => Navigator.of(context).pop('cancel'),
)
],
),
),
);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CupertinoTabScaffold(
tabBar: CupertinoTabBar(items: [
BottomNavigationBarItem(
icon: Icon(Icons.music_note),
),
BottomNavigationBarItem(
icon: Icon(Icons.settings),
),
]),
tabBuilder: (context, index) {
switch (index) {
case 0:
return CupertinoTabView(
builder: (context) {
return CupertinoPageScaffold(
child: FlatButton(
child: Text('button'),
onPressed: () => onPressed(context),
),
);
},
);
case 1:
return CupertinoTabView(
builder: (context) {
return CupertinoPageScaffold(
child: Text('tab 2'),
);
},
);
}
return Container();
}));
}
}