Я пытаюсь создать панель поиска, используя виджеты Купертино и щепки.
В настоящее время у меня есть следующая структура:
CupertinoApp
CupertinoTabScaffold
CupertinoPageScaffold
CustomScrollView
SliverNavigationBar
SliverPersistentHeader
_SliverSearchBarDelegate
CupertinoTextField
SliverPersistentHeader имеет делегата, который реализован следующим образом:
class _SliverSearchBarDelegate extends SliverPersistentHeaderDelegate {
_SliverSearchBarDelegate({
@required this.child,
this.minHeight = 56.0,
this.maxHeight = 56.0,
});
final Widget child;
final double minHeight;
final double maxHeight;
@override
double get minExtent => minHeight;
@override
double get maxExtent => maxHeight;
@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
return SizedBox.expand(child: child);
}
@override
bool shouldRebuild(_SliverSearchBarDelegate oldDelegate) {
return maxHeight != oldDelegate.maxHeight ||
minHeight != oldDelegate.minHeight ||
child != oldDelegate.child;
}
}
И экранный виджет выглядит так:
class CategoriesScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
child: CustomScrollView(
slivers: <Widget>[
CupertinoSliverNavigationBar( /* ... */ ),
SliverPersistentHeader(
delegate: _SliverSearchBarDelegate(
child: Container(
/* ... */
child: CupertinoTextField( /* ... */ ),
),
),
)
],
),
);
}
}
Проблема в том, что когда я фокусируюсь на текстовом поле, похоже, что клавиатура пытается показать, но затем сразу скрывается. Я думал, что это поведение появляется из-за событий scrollview, но добавление ScrollController в CustomScrollView не дало мне никаких результатов (не было событий прокрутки при фокусировке текстового поля).
Я также думал, что проблема появляется только в симуляторе, но на реальном устройстве поведение такое же.
Вот видео демонстрация проблемы:
ОБНОВЛЕНИЕ : Благодаря Раджа Джайн Я понял, что проблема не в щепках или самом виджете CategoriesScreen
, а в CupertinoTabScaffold
, в котором этот виджет обернут. Если я удаляю CupertinoTabScaffold
и устанавливаю домашний виджет CupertinoApp
в виджет CategoriesScreen
напрямую, проблема исчезает. Вот мой main.dart
здесь, надеюсь, это поможет, но я не знаю как, потому что в этом нет ничего особенного:
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoApp(
/* ... */
// home: CategoriesScreen(),
home: CupertinoTabScaffold(
tabBar: CupertinoTabBar(
/* ... */
items: <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.all, size: 20.0),
title: Text('Items'),
),
BottomNavigationBarItem(
icon: Icon(Icons.categories, size: 20.0),
title: Text('Categories'),
)
],
),
tabBuilder: (BuildContext tabBuilderContext, int index) {
return CategoriesScreen();
},
),
);
}
}