目前我正在使用Flutter创建一个应用程序,其中包含几个可以订购和过滤的列表。当订购或过滤器处于活动状态时,应用栏下方会显示持久栏,指示哪些过滤器处于活动状态。这是通过使用ListView
在StackView
之上堆叠int,并使用它的填充将ListView
向下移动一点来实现的。下图中可以看到一个例子:
现在我尝试使用CustomScrollView
和SliverAppBar
创建第二个视图,我想要同样的#34;过滤条"这里的行为。我尝试将SliverList
与单个项目一起使用,并在SliverList
下使用过滤后的项目,但两个列表都滚动,就像它们是一个长列表一样。我还尝试通过bottom
的{{1}}属性添加一个栏,但这会产生一个位于应用栏标题上的栏,据我所知,没有办法提升这个头衔。此结果可在下图中看到(红色条是第一个图像中过滤条的占位符)。
有没有办法实现这一目标"执着"条形码效果在SliverAppBar
CustomScrollView
?
答案 0 :(得分:0)
由于屏幕上有多个可滚动视图需要管理,因此您需要使用 NestedScrollView
。这应该可以解决两个可滚动小部件像单个长列表一样滚动的问题。
这里有一个示例,说明如何实现它,类似于您提供的屏幕截图。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
home: MyStatelessWidget(),
);
}
}
class MyStatelessWidget extends StatelessWidget {
MyStatelessWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
// This will help manage the SliverAppBar and ListView
body: NestedScrollView(
floatHeaderSlivers: true,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
flexibleSpace: FlexibleSpaceBar(
background: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/background.jpeg"),
fit: BoxFit.cover,
),
),
child: Container(
padding: EdgeInsets.all(16.0),
alignment: Alignment.centerLeft,
child: Text(
'Title',
style: TextStyle(color: Colors.white, fontSize: 36.0),
),
),
),
),
// title: const Text('Title'),
floating: true,
pinned: true,
expandedHeight: 300.0,
forceElevated: innerBoxIsScrolled,
bottom: AppBar(
backgroundColor: Colors.red,
toolbarHeight: 64.0,
),
),
];
},
body: ListView.builder(
padding: const EdgeInsets.all(8),
itemCount: 30,
itemBuilder: (BuildContext context, int index) {
return Container(
height: 50,
child: Center(child: Text('Item $index')),
);
},
),
),
);
}
}