Я пытаюсь создать панель поиска, используя виджеты и ленты из Купертино. На данный момент у меня следующая структура:
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();
},
),
);
}
}