Cupertino ウィジェットとスライバーを使用して検索バーを作成しようとしています。現在、私は次の構造を持っています:
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 イベントが原因で発生すると考えていましたが、CustomScrollView に ScrollController を追加しても結果は得られませんでした (テキスト フィールドのフォーカス中にスクロール イベントは発生しませんでした)。
また、問題はシミュレーターでのみ発生すると考えていましたが、実際のデバイスでは動作は同じです。
問題のビデオデモは次のとおりです。
更新: Raja Jain のおかげで、問題はスライバーや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();
},
),
);
}
}