Флаттер, показывающий снэк-бар на верхней части листа
В моем коде я вызываю нижний лист для отображения списка плиток. Эти плитки содержат кнопки, которые отображают закусочную. Эта функциональность работает нормально, единственная проблема в том, что снэк-бар отображается за нижним листом, поэтому вы можете увидеть его, только если закроете нижний лист. Каждый из них вызывается с помощью следующего кода:
1. Нижний лист:
void _settingModalBottomSheet(context, stream, scaffoldKey ) {
if (_availableRides.length == 0) {
return null;
} else {
return scaffoldKey.currentState.showBottomSheet((context) {
return Column(
children: Widgets;
});
}
}
2. Снэк-бар
widget.scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text("Created", textAlign:
TextAlign.center,),),
Кто-нибудь знает, как я могу расположить закусочную перед нижним листом
9 ответов
Таким образом, я смог решить эту проблему, просто добавив еще один Scaffold() к моему нижнему листу и передав ему новый ключ scaffold
SnackBar
есть для этого свойство. Это называетсяbehavior
, вы можете сделать это:
SnackBar(
behavior: SnackBarBehavior.floating,
...
плавающий - const SnackBarBehavior
Такое поведение приведет к тому, что SnackBar будет отображаться над другими виджетами в Scaffold. Это включает отображение над BottomNavigationBar и FloatingActionButton.
См. Дополнительные сведения на сайте material.io/design/components/snackbars.html.
Я решил эту проблему с помощью простого решения, но оно работает
Решение в 3 шага:
1 ДобавитьSizedBox
и установите ту же высоту BottomSheet
2. ДобавьтеScaffold
как дочерний элемент SizedBox
3. Добавьте свой нижний лист
SizedBox(
height: ... ,// height of bottomSheet
child: Scaffold(
body: ... , // your bottomSheet
)
)
Я пришел к довольно приличному решению. Я завернул свой нижний лист в файл , но добавил его какbottomSheet
параметр. При добавленииScaffold
, будет добавлен задний фон, поэтому я просто сделал его фон прозрачным.
Scaffold(
backgroundColor: Colors.transparent,
bottomSheet: ...,
)
Я решил с помощью Set (отступ снизу до SnackBar) На столько, сколько высота (bottomSheet: height) .
В этом случае у меня есть нижний лист:
bottomSheet: Container(
child: RaisedButton(...),
width: MediaQuery.of(context).size.width,
height: AppBar().preferredSize.height * 0.85,
),
И эта закусочная:
_scaffoldKey.currentState.showSnackBar(SnackBar(
padding:EdgeInsetsDirectional.only(
bottom:AppBar().preferredSize.height * 0.85),
backgroundColor: Colors.red,
duration: new Duration(milliseconds: 3000),
content: Text('ETC..'),
));
Вы можете добиться этого, просто обернув виджет BottomSheet с помощью Scaffold.
например:
void _settingModalBottomSheet(context, stream, scaffoldKey ) {
if (_availableRides.length == 0) {
return null;
} else {
return scaffoldKey.currentState.showBottomSheet((context) {
return Scaffold(
body: Column(
children: Widgets;
})
);
}
}
Это рабочее решение согласно документации. https://docs.flutter.dev/cookbook/design/snackbars
Этот пример работает и с нижними листами.
- Инициализировать .
- Оберните виджет вашего компонента с помощью .
- Сворачивать
Scaffold
с . - Добавить ключ
scaffoldMessengerKey
кScaffoldMessenger
- Метод вызова
scaffoldMessengerKey.currentState?.showSnackBar(SnackBar());
Пример:
final scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
// Any widget with button.
// (Bottom sheet also) - root widget must be ScaffoldMessenger.
ScaffoldMessenger(
key: scaffoldMessengerKey,
child: Scaffold(
body: Container(
child: ElevatedButton(
style: raisedButtonStyle,
onPressed: () {
scaffoldMessengerKey.currentState?.showSnackBar(
//SnackBar design.
SnackBar(
backgroundColor: Colors.white,
elevation: 8,
content: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
child: Text(
'Simple snackbar text.',
style: FlutterFlowTheme.of(context).bodyText1
.override(fontFamily: 'Rubik',
fontWeight: FontWeight.w300,
lineHeight: 1.5,
),
),
action: SnackBarAction(
label: 'Undo',
onPressed: () {
// Some code to undo the change.
},
),
duration: Duration(seconds: 5),
behavior: SnackBarBehavior.floating,
},
child: Text('Open snackbar over bottom sheet!'),
); //ElevatedButton
); //Container
); //Scaffold
); //ScaffoldMessenger
Примечание. При таком подходе вам не нужно передавать BuildContext.
Если вы не хотите регистрироватьсяScaffoldMessengerKey
. Вы можете показать SnackBar следующим образом:ScaffoldMessenger.of(context).showSnackBar(SnackBar());
Я решил это, изменив bottomSheet
к bottomNavigationBar
поскольку решение с плавающей закусочной мне не подошло.
вы можете использовать пакет flushbar . Я думаю, что это лучший вариант, если нужно использовать нижний лист.
любое событие внутри нижнего листа
CustomFlushBar().flushBar(text: 'Thank you for your payment!', context: context,duration: 2);
Класс CustomFlushBar
class CustomFlushBar {
void flushBar({int duration, @required String text, Color iconColor, IconData iconData, Color backgroundColor, @required BuildContext context}) async {
await dismiss();
Flushbar(
margin: EdgeInsets.all(8),
borderRadius: 8,
backgroundColor: backgroundColor ?? Palette.greenButton,
icon: Icon(iconData ?? Icons.done, color: iconColor ?? Palette.white),
flushbarStyle: FlushbarStyle.FLOATING,
message: text,
duration: Duration(seconds: duration ?? 3),
)..show(context);
}
Future<void> dismiss() async {
if (!Flushbar().isDismissed()) {
await Flushbar().dismiss();
}
}
}