几乎所有 Apple 应用程序以及 iOS 上的大多数第三方应用程序都有统一的标题区域。它由一个狭窄的按钮应用栏组成,下方是一个大标题,最后是一个搜索/过滤文本字段。它的特别之处在于动画,我无法做到这一点。Apple 联系人应用程序的图像显示了所描述的标题区域。
乍一看,标题可以翻译成 Cupertino 小部件,如下所示:
- 自定义滚动视图
- CupertinoSliverNavigationBar
- CupertinoSliverRefreshControl
- SliverToBoxAdapter
- 库比蒂诺文本字段
但是,在 sliver 应用栏和 LargeTitle 之间是 UpdateIndicator,文本字段在获得焦点时向上移动并获得一个取消按钮。
我当前的代码:
class TestTab extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
child: SafeArea(
child: CustomScrollView(
slivers: <Widget>[
/*
SliverPersistentHeader(
delegate: MyNav(),
pinned: true,
floating: false,
),
*/
CupertinoSliverNavigationBar(
padding: EdgeInsetsDirectional.fromSTEB(5, 0, 5, 0),
leading: CupertinoButton(
padding: EdgeInsets.zero,
child: Text('Leading'),
onPressed: () => {},
),
middle: Text('Middle'),
trailing: Icon(CupertinoIcons.add),
largeTitle: Text('LargeTitle'),
),
CupertinoSliverRefreshControl(
onRefresh: () {
print("Refresh was triggered");
return Future<void>.delayed(const Duration(seconds: 1));
},
),
SliverToBoxAdapter(
child: Column(
children: <Widget>[
CupertinoTextField(
prefix: Icon(CupertinoIcons.search),
textInputAction: TextInputAction.done,
autocorrect: true,
placeholder: "Filter",
clearButtonMode: OverlayVisibilityMode.editing,
maxLength: 40,
onChanged: (String value) {
return;
},
onSubmitted: (String value) {
return;
},
),
],
),
),
SliverSafeArea(
top: false,
minimum: const EdgeInsets.only(top: 8),
sliver: SliverList(
delegate: SliverChildListDelegate(
[
Container(
child: Text('Content'),
),
],
),
),
),
],
),
),
);
}
}
如何将 CupertinoSliverNavigationBar 分开,以便将 largeTitle 单独放置在 ListView 中,使 UpdateIndicator 介于两者之间?
对焦时如何将搜索栏移到顶部?
如何在搜索框右侧显示取消按钮?