Flutter showModalBottomSheet скрыт за CupertinoTabBar
Я использую CupertinoTabBar, но хочу показать материальный дизайн BottomSheet, когда пользовательское устройство - Android. Однако, когда я использовал их оба, BottomSheet был скрыт за 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();
}
)
);
}
}
2 ответа
Вам просто нужно установить
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'),
)
],
),
);
}
Вы можете установить отступы ниже или установить для этого высоту контейнера. Я редактирую ваш код, устанавливая некоторые отступы, проверьте это.
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();
}));
}
}