#flutter #flutter-sliverappbar
Вопрос:
SliverAppBar содержит поле поиска по текстовому полю, но при прокрутке оно прокручивается вверх. Как отобразить окно поиска при прокрутке. Я делал свои собственные работы, но не работал. Если есть какой-либо ресурс о Sliverappbar и Slivergrid, он также полезен. Но теперь, как закрепить текстовое поле панели приложений?
SliverAppBar(
//snap: true,
stretch: true,
//floating: true,
title: Text('Home'),
centerTitle: true,
expandedHeight: 100.0,
backgroundColor: Colors.red,
leading: IconButton(
icon: Icon(
Icons.menu,
color: Colors.white,
),
onPressed: () {},
),
actions: [
IconButton(
icon: Icon(
Icons.notifications,
color: Colors.white,
),
onPressed: () {},
),
],
//floating: false,
pinned: true,
flexibleSpace: ListView(
children: [
SizedBox(
height: 40.0,
),
Padding(
padding: const EdgeInsets.only(
top: 12.0,
bottom: 12.0,
left: 8.0,
right: 8.0,
),
child: Container(
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5.0)),
child: TextField(
decoration: InputDecoration(
labelText: "Search products...",
border: InputBorder.none,
icon: IconButton(onPressed: () {}, icon: Icon(Icons.search)),
),
),
),
),
],
),
);
Ответ №1:
flexibleSpace
был разработан для этой цели эффекта прокрутки, он будет уменьшаться в зависимости от прокрутки. Тем не менее, вы можете получить пользовательский интерфейс вашего желания, используя title
вот демонстрационную версию
SliverAppBar(
//snap: true,
stretch: true,
//floating: true,
toolbarHeight: 100.0 kToolbarHeight,
/// based on your desing
title: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
IconButton(
icon: Icon(
Icons.menu,
color: Colors.white,
),
onPressed: () {},
),
Text('Home'),
IconButton(
icon: Icon(
Icons.notifications,
color: Colors.white,
),
onPressed: () {},
),
],
),
Padding(
padding: const EdgeInsets.only(
top: 12.0,
bottom: 12.0,
left: 8.0,
right: 8.0,
),
child: Container(
height: 40,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5.0)),
child: TextField(
decoration: InputDecoration(
labelText: "Search products...",
border: InputBorder.none,
icon: IconButton(
onPressed: () {}, icon: Icon(Icons.search)),
),
),
),
),
],
),
centerTitle: true,
// expandedHeight: 100.0,
backgroundColor: Colors.red,
// leading: IconButton(
// icon: Icon(
// Icons.menu,
// color: Colors.white,
// ),
// onPressed: () {},
// ),
// actions: [
// ],
//floating: false,
pinned: true,
),
Это решает ваш вопрос?
Комментарии:
1. Чтобы получить правильный пользовательский интерфейс, я бы предпочел использовать
Row
его путем заменыleading
иactions
иметь больший контроль над пользовательским интерфейсом.2. Спасибо, я проверю и переиграю.
3. Это почти получилось, но заголовок панели приложений и значки не выровнены вверху.
4. Текстовое поле работает нормально. но заголовок панели приложений отображается вверху, значки действий под ним.
5. Как я уже упоминал ранее, нам нужно использовать replace
leading
иactions
with row, я обновил ответ.