我想创建一个水平滚动列表,当从左侧或右侧滑动时,使用捕捉以适应效果.
每张卡片之间有一些间距,适合屏幕,类似于下图
除此之外,这些可水平滚动的列表元素应包含在垂直可滚动列表中.
我所能实现的只是在flutter docs中跟随示例之后才显示水平滚动卡列表.
class SnapCarousel extends StatelessWidget {
@override
Widget build(BuildContext context) {
final title = 'Horizontal List';
return MaterialApp(
title: title,
home: Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Container(
margin: EdgeInsets.symmetric(vertical: 20.0),
height: 200.0,
child: ListView(
scrollDirection: Axis.horizontal,
children: <Widget>[
Container(
width: 160.0,
color: Colors.red,
),
Container(
width: 160.0,
color: Colors.blue,
),
Container(
width: 160.0,
color: Colors.green,
),
Container(
width: 160.0,
color: Colors.yellow,
),
Container(
width: 160.0,
color: Colors.orange,
),
],
),
),
),
);
} …Run Code Online (Sandbox Code Playgroud) dart flutter flutter-sliver flutter-layout flutter-animation
Flutter中SliverList和ListView有什么区别?
我有一个SliverListwith SliverChildBuilderDelegate,我的问题是我无法设置ScrollController ,SliverList因为我想控制我的列表的滚动,我正在寻找滚动到列表中的特定项目(非常大),通常ListView这项工作很容易,我我想知道为什么没有像这样的controller财产?SliverListListView
注意:我知道CustomScrollView有controller属性并且我已经测试过,但这将控制整个视口,而不仅仅是列表
@override
Widget build(BuildContext context) {
MainState m = Provider.of<MainState>(context, listen: false);
return DefaultTabController(
length: m.itemCategoryList.length,
child: Scaffold(
// appBar: _createAppBar(),
body: Builder(builder: (context) => _createBody(context))),
);
}
AppBar _createAppBar() {
MainState m = Provider.of<MainState>(context);
return AppBar(
title: Text(
m.selectedPartner.fullname,
style: Theme.of(context).textTheme.display3,
),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
),
);
}
_createBody(BuildContext context) {
MainState …Run Code Online (Sandbox Code Playgroud) 我有一个凸起按钮列表,我希望所选按钮的背景颜色在其 onPressed() 中更改
我尝试更改 setState 中的颜色,但它没有做任何事情。
这是生成按钮列表的函数
List<Widget> _makeZoneList(List<Zone> zones) {
List<Widget>Buttons = new List();
for (int i = 0; i < zones.length; i++) {
Buttons.add(RaisedButton(
color: zones[i].isSelected ? AppColors.primaryColor : AppColors.white,
onPressed: () {
setState(() {
if (zones[i].isSelected){
zones[i].isSelected = false;
}
else{
zones[i].isSelected = true;
}
print(zones[i].isSelected.toString());
});
},
child: Text(zones.elementAt(i).text)
));
}
return Buttons;
}
Run Code Online (Sandbox Code Playgroud)
这是我调用函数的地方
Widget _zoneBody() {
return Padding(
padding: EdgeInsets.all(32),
child: StreamBuilder<List<Zone>>(
stream: GetterBloc.zonesStream,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return …Run Code Online (Sandbox Code Playgroud) 我们如何在 SliverList 中实现 Separator/Divider。ListView.separated 是在列表中创建分隔符的便捷方法,但我没有看到任何关于 SliverList 的文档或示例
在过去的几天里,我一直在阅读颤动的框架文档,特别是条子部分,但我不太清楚从哪里开始.我正在尝试实现粘性标题和捕捉效果.RenderSliverList可能是一个好的开始吗?我需要重新布局吗?我需要做额外的绘图吗?如果是这样的话?
任何帮助,从哪里开始将是一个巨大的帮助,提前感谢!
编辑:我想我现在理解了布局部分,但我无法找到绘画应该发生的地方.
编辑2:为了澄清,这是所需的"粘性标题效果":
如何在RecyclerView中制作粘性标题?(没有外部库)
这是"快照"效果:
SliverAppBar有一个属性bottom,它必须有preferredSize。
现在我让它返回恒定值:
...
new SliverAppBar(
expandedHeight: _kFlexibleSpaceMaxHeight,
flexibleSpace: new FlexibleSpaceBar(.....)
...
bottom: new BottomBar(...), // has to have preferredSize
),
...
class BottomBar extends StatelessWidget implements PreferredSizeWidget {
...
@override
Size get preferredSize {
return new Size.fromHeight(my_constant_height_value);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想在这个底部小部件中放置一个文本,但我不知道其中的文本有多长。
如何实现底部小部件的动态高度?
有没有办法在布局之前测量小部件的高度?
编辑2018年4月25日
最终,我遵循蒂博的指示并得到了以下结果:
// 'as rendering' to avoid conflict with 'package:intl/intl.dart'
import 'package:flutter/rendering.dart' as rendering;
...
// this is the function that returns the height of a Text widget
// given the text
double getHeight(String text, BuildContext context, …Run Code Online (Sandbox Code Playgroud) 我查看了 Flutter 文档,试图找到一个事件、回调,甚至是在 FlexibleSpaceBar 折叠或展开时可以挂钩的状态。
return new FlexibleSpaceBar(
title: new Column(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
new Text(_name, style: textTheme.headline),
new Text(_caption, style: textTheme.caption)
]),
centerTitle: false,
background: getImage());`
Run Code Online (Sandbox Code Playgroud)
当 FlexibleSpaceBar 被对齐(折叠)时,我想隐藏_caption文本并只显示_name文本。当它完全展开时,我显然想同时显示_name和_caption。
我该怎么做?
我不熟悉颤振,所以我对此有些迷失。
我有主页SliverPersistentHeader和TabBarView喜欢下面的代码:
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).backgroundColor,
body: DefaultTabController(
length: 3,
child: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverAppBar(
expandedHeight: 250.0,
floating: false,
pinned: true,
),
SliverPersistentHeader(
delegate: _SliverAppBarDelegate(
TabBar(
labelStyle: TextStyle(
fontFamily: 'Raleway',
fontSize: 17,
fontWeight: FontWeight.w400,
color: Theme.of(context).backgroundColor),
indicatorColor: Theme.of(context).hintColor,
labelColor: Theme.of(context).buttonColor,
unselectedLabelColor: Theme.of(context).dividerColor,
tabs: [
Tab(text: "Menu"),
Tab(text: "About"),
Tab(text: "Contact"),
],
),
),
pinned: true,
),
];
},
body: TabBarView(
children: <Widget>[MenuTab(), AboutTab(), ContactTab()],
),
), …Run Code Online (Sandbox Code Playgroud) 我将 CustomScrollView 与 SliverGrid 一起使用。我使用以下命令在网格项之间添加空间:mainAxisSpacing:8,crossAxisSpacing:8。但是是否可以在第一列之前和最后一列之后添加空间(边距/填充)。我尝试将 SliverGrid 包裹在 Padding 中,但出现错误:
RenderViewport 期望有一个 RenderSliver 类型的子代,但收到了一个 RenderPadding 类型的子代。
渲染对象需要特定类型的子对象,因为它们在布局和绘制期间与其子对象进行协调。例如,RenderSliver 不能是 RenderBox 的子级,因为 RenderSliver 不理解
请帮助我如何添加 GridView 的开始和结束边距。