- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 3 个 child 的 CustomScrollView。我想渲染第三个 child 而不是第二个 child 。
我使用 sliver 是因为我想在 ListView 下方渲染一个框,并且当用户滚动时该框将向上滚动。此行为有效,但问题是 ListView 呈现在框下方。
这是我的代码:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(statusBarColor: Colors.transparent));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
backgroundColor: Color(0xFF26B89A),
expandedHeight: 350,
pinned: true,
),
AppBarOverflow(
child: Container(
width: double.infinity,
height: 100,
color: Color(0xFF26B89A),
),
),
SliverList(
delegate: SliverChildListDelegate.fixed([
buildItem(),
buildItem(),
buildItem(),
buildItem(),
buildItem(),
buildItem(),
buildItem(),
buildItem(),
]),
),
],
)
);
}
Widget buildItem() {
return Container(
alignment: Alignment.center,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 3.0),
child: Card(
child: Container(
width: 400,
height: 100,
),
),
),
);
}
}
class AppBarOverflow extends SingleChildRenderObjectWidget {
AppBarOverflow({Widget child, Key key}): super(child: child, key: key);
@override
RenderObject createRenderObject(BuildContext context) {
// TODO: implement createRenderObject
return _AppBarOverflowRenderObject();
}
}
class _AppBarOverflowRenderObject extends RenderSliverSingleBoxAdapter {
_AppBarOverflowRenderObject({
RenderBox child,
}) : super(child: child);
@override
void paint(PaintingContext context, Offset offset) {
if (child != null && geometry.visible) {
context.paintChild(child, offset);
}
}
@override
void performLayout() {
if (child == null) {
geometry = SliverGeometry.zero;
return;
}
child.layout(constraints.asBoxConstraints(), parentUsesSize: true);
var _scrolled = -(constraints.viewportMainAxisExtent - constraints.remainingPaintExtent * 2);
if (_scrolled < 0)
_scrolled = 0;
geometry = SliverGeometry(
paintExtent: child.size.height,
maxPaintExtent: child.size.height,
paintOrigin: -(_scrolled / 3),
layoutExtent: 10,
);
setChildParentData(child, constraints, geometry);
}
}
我想要的结果:
最佳答案
嗨,我用另一种方式做到了。您需要这样的东西吗?
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.green,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
ScrollController scrollcontroller;
@override
void initState() {
scrollcontroller = ScrollController()
..addListener(() {
print(scrollcontroller.offset);
});
super.initState();
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.transparent));
}
@override
void dispose() {
scrollcontroller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
controller: scrollcontroller,
headerSliverBuilder: (context, value) {
return <Widget>[
SliverAppBar(
backgroundColor: Color(0xFF26B89A),
expandedHeight: 350,
pinned: true,
),
];
},
body: ListView(
physics: ClampingScrollPhysics(),
padding: EdgeInsets.zero,
children: <Widget>[
_FirstItem(scrollcontroller),
_Item(),
_Item(),
_Item(),
_Item(),
_Item(),
_Item(),
_Item(),
_Item(),
],
),
),
);
}
}
class _FirstItem extends StatelessWidget {
_FirstItem(this.scrollcontroller);
final ScrollController scrollcontroller;
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
AnimatedBuilder(
animation: scrollcontroller,
builder: (_, __) {
var height = 230 - scrollcontroller.offset;
var maxHeight = 90.0;
return Container(
color: Color(0xFF26B89A),
width: double.infinity,
height: height < maxHeight ? height > 0 ? height : 0 : maxHeight,
);
},
),
_Item(),
],
);
}
}
class _Item extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
alignment: Alignment.center,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 3.0),
child: Card(
child: Container(
width: 400,
height: 100,
),
),
),
);
}
}
关于flutter - 如何在 CustomScrollView 中设置绘制顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59552302/
一个简单的例子是: Scaffold( floatingActionButton: _fab(), floatingActionButtonLocation:
我想要一个 View ,顶部有一个不可滚动的部分,例如图像,底部有一个标签栏,我可以滚动到顶部以显示项目列表并能够在项目列表内滚动。 为此,我使用了一个 CustomScrollView,暂时用一个细
使用 slivers 和 sliver appbar 时出现滚动问题。当视频中不需要滚动时,如何防止 ScrollView 滚动。如果有足够的滚动项,它应该滚动(这很好用) 我关注了这个中等帖子。你可
我正在尝试使用 CustomScrollView 创建一个 ScrollView .我需要的效果,和 this one 非常相似. 我需要 SliverList堆叠在 SliverAppbar 上方,
我正在制作的 UI 通常从一直滚动到底部的 strip 开始,因此它的顶部位于 View 的顶部。而且: 顶部需要一个额外的空白空间,以防用户想要将内容拉下来,这样他们无需将手从手机底部移开就可以拿到
我有一个带有 3 个 child 的 CustomScrollView。我想渲染第三个 child 而不是第二个 child 。 我使用 sliver 是因为我想在 ListView 下方渲染一个框,
我正在构建一个垂直滚动的日历,我已经将我的日子实现为多个 SliverList,这样我就可以在专注于某一天的情况下进行初始化,同时仍然有过去和 future 的日子。 问题是,当 focusDate
用 SliverFillRemaining 包装 TabBarView(像 Expanded 一样填充剩余的空白空间)会产生以下错误输出。 flutter:RenderPositionedBox 需要
我正在尝试创建一个具有 WebView(来自 webview_flutter: ^0.3.5+3)和 AppBar 的屏幕,我想在用户滚动时将其滚动到屏幕外。 我偶然发现了这个 guide并尝试实现类
在我的应用程序中,我使用 CustomScrollView ,当滚动位置到达 ScrollView 几乎结束时应该加载更多数据(当前是 position.pixels - 100.0 )。该机制工作正
我想在 CustomScrollView 中使用动画切换状态,但它抛出错误。 class SliverAnimatedSwitcher extends StatefulWidget { final
我有一个 CustomScrollView 包含一个:- 1- SliverToBoxAdapter 有小部件树 2- SliverList 问题发生在我 Wrap 时SliverList 与 Pag
我是一个刚接触 Flutter 的新手。 我想使用 CustomScrollView 作为 Row/Column Widget 的子级 当 CustomScrollView 是 root 时,它工作得
我正在尝试自动滚动到 CustomScrollView 内的 SliverList 的末尾。 SliverList 本身没有 Controller 属性,因此我必须将 ScrollController
我正在尝试自动滚动到 CustomScrollView 内的 SliverList 的末尾。 SliverList 本身没有 Controller 属性,因此我必须将 ScrollController
你好我是 Android 开发的新手,我读过各种线程,它们讨论了 ListView 不应该在 Scrollview 内并且需要包装的事实线性或相对布局。 但是我有这样的布局
如何在CustomScrollView的底部制作一个按钮固定“粘滞” 如何实现如截图 /image/RDCn9.png 最佳答案 一种方法——使用——BottomNavigationBar @ov
我很难理解 NestedScrollView 和 CustomScrollView 之间的区别? 最佳答案 CustomScrollView - 是使用 Sliver 对象构建任何基于“滚动”的布局的
如何获取在 Flutter CustomScrollView 中可见/滚动的当前 sliver 项目? 我的 CustomScrollView 内部有多个 SliverGrid 和 SliverToB
我正在使用 flutter 来显示一些 html 页面,是否可以在 CustomScrollView 向上滚动时隐藏 appBar?然后我可以有更多的屏幕区域来显示 html 内容。这是我当前的代码片
我是一名优秀的程序员,十分优秀!