- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SliverAppBar
带有 TabBar
和项目列表,导致滚动 Controller 报错。
我用下面的方式实现了它,有一个 NestedScrollView
有一个 SliverAppBar
,一个 SliverPersistentHeader
包含 TabBar
然后是 NestedScrollView
的主体,其中包含 TabBarView
和 CustomScrollViews
内的 SliverLists
。
滚动 Controller 似乎会导致问题。它说它附加到多个 View 。因此,我尝试向每个自定义 ScrollView 添加一个新的滚动 Controller ,但这会阻止条形应用栏在滚动列表本身时折叠。
除此之外,它也不会记住切换选项卡时的滚动状态...我尝试过使用 AutomaticKeepAliveClientMixin
,但这似乎不起作用。任何关于如何解决滚动问题和滚动 Controller 状态的建议都会受到欢迎? :)
另请注意:我只在 Flutter Web 上进行测试,而不是在移动设备上进行测试...
不知道是我代码的bug还是flutter的bug。
请看下面我的 flutter 医生:
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel unknown, 2.5.0, on Microsoft Windows [Version 10.0.22000.434], locale en-ZA)
[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
X cmdline-tools component is missing
Run `path/to/sdkmanager --install "cmdline-tools;latest"`
See https://developer.android.com/studio/command-line for more details.
X Android license status unknown.
Run `flutter doctor --android-licenses` to accept the SDK licenses.
See https://flutter.dev/docs/get-started/install/windows#android-setup for more details.
[√] Chrome - develop for the web
[√] Android Studio (version 4.0)
[√] Connected device (2 available)
! Doctor found issues in 1 category.
滚动 Controller 抛出的异常如下:
══╡ EXCEPTION CAUGHT BY ANIMATION LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown while notifying status listeners for AnimationController:
The provided ScrollController is currently attached to more than one ScrollPosition.
The Scrollbar requires a single ScrollPosition in order to be painted.
When the scrollbar is interactive, the associated Scrollable widgets must have unique
ScrollControllers. The provided ScrollController must be unique to a Scrollable widget.
When the exception was thrown, this was the stack:
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 251:49 throw_
packages/flutter/src/widgets/scrollbar.dart 1315:9 <fn>
packages/flutter/src/widgets/scrollbar.dart 1338:14 [_debugCheckHasValidScrollPosition]
packages/flutter/src/widgets/scrollbar.dart 1257:14 [_validateInteractions]
packages/flutter/src/animation/listener_helpers.dart 233:27 notifyStatusListeners
packages/flutter/src/animation/animation_controller.dart 814:7 [_checkStatusChanged]
packages/flutter/src/animation/animation_controller.dart 748:5 [_startSimulation]
packages/flutter/src/animation/animation_controller.dart 611:12 [_animateToInternal]
packages/flutter/src/animation/animation_controller.dart 495:12 reverse
packages/flutter/src/widgets/scrollbar.dart 1412:37 <fn>
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart 48:19 internalCallback
The AnimationController notifying status listeners was:
AnimationController#25a6e(◀ 1.000)
下面是我的代码:
class MyApp extends StatefulWidget {
MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> { // with AutomaticKeepAliveClientMixin
ScrollController _scrollController = ScrollController();
bool _isAppBarExpanded = true;
@override
void initState() {
super.initState();
_scrollController.addListener(() {
_isAppBarExpanded = _scrollController.hasClients && _scrollController.offset < (200 - kToolbarHeight);
setState(() { });
});
}
@override
Widget build(BuildContext context) {
// super.build(context); // AutomaticKeepAlive
const String title = "Floating App Bar";
return MaterialApp(
title: title,
home: Scaffold(
body: DefaultTabController(
length: 2,
child: NestedScrollView(
controller: _scrollController,
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget> [
SliverAppBar(
backgroundColor: (_isAppBarExpanded) ? Colors.white : Colors.blue,
expandedHeight: 200.0,
floating: false,
pinned: true,
flexibleSpace: FlexibleSpaceBar(
centerTitle: true,
title: Text(
"Collapsing Toolbar",
style: TextStyle(
color: Colors.white,
fontSize: 16.0,
),
),
background: ClipRRect(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(30.0),
bottomRight: Radius.circular(30.0),
),
child: Image.network(
"https://images.pexels.com/photos/396547/pexels-photo-396547.jpeg?auto=compress&cs=tinysrgb&h=350",
fit: BoxFit.cover,
),
),
),
),
SliverPersistentHeader(
delegate: _SliverAppBarDelegate(
TabBar(
labelColor: Colors.black87,
unselectedLabelColor: Colors.grey,
tabs: <Widget> [
Tab(
icon: Icon(Icons.info),
text: "Tab 1",
),
Tab(
icon: Icon(Icons.lightbulb_outline),
text: "Tab 2",
),
],
),
),
pinned: true,
),
];
},
body: TabBarView(
children: <Widget> [
CustomScrollView(
slivers: <Widget> [
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Text("Item " + index.toString());
},
childCount: 200,
// addAutomaticKeepAlives: true,
),
),
],
),
CustomScrollView(
slivers: <Widget> [
SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Text("Test " + index.toString());
},
childCount: 100,
// addAutomaticKeepAlives: true,
),
),
],
),
],
),
),
),
),
);
}
// for AutomaticKeepAlive
// @override
// bool get wantKeepAlive {
// return true;
// }
}
class _SliverAppBarDelegate extends SliverPersistentHeaderDelegate {
_SliverAppBarDelegate(this._tabBar);
final TabBar _tabBar;
@override
double get minExtent {
return _tabBar.preferredSize.height + 30;
}
@override
double get maxExtent {
return _tabBar.preferredSize.height + 30;
}
@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
return Container(
alignment: Alignment.center,
color: Theme.of(context).scaffoldBackgroundColor,
child: Padding(
padding: EdgeInsets.only(top: 15.0, bottom: 15.0),
child: _tabBar,
),
);
}
@override
bool shouldRebuild(_SliverAppBarDelegate oldDelegate) {
return false;
}
}
最佳答案
这个问题可以通过在CustomScrollView
上添加另一个ScrollController
来解决。
final ScrollController _scrollController2 = ScrollController();
....
TabBarView(
children: <Widget>[
CustomScrollView(
controller: _scrollController2,
您还可以将另一个添加到下一个 CustomScrollView
。
关于flutter - CustomScrollView 内带有 TabBar 和 SliverList 的 SliverAppBar 导致 : ScrollController is currently attached to more than one ScrollPosition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70785638/
我想实现如下布局: Layout Link 到目前为止,我正在使用 Sliver。但问题是SearchBar!我希望 SliverAppBar 与布局完全一样并固定在顶部。有什么建议吗? 我试图通过此
我在 sliver 应用栏及其内容方面遇到了一些问题。当我向下滚动 SliverList 的内容(在下面的代码中)时,我想调整 flexibleSpace 中的图像大小,以适应列表顶部元素的图像。 现
我在SliverAppBar中使用flexibleSpace,其中包含以下内容: float :true,固定:false,捕捉:true:当我向上滚动时。它显示AppBar和flexibleSpac
我将 Flutter 的 SliverAppBar 与 SliverList 结合使用。应用栏可以很好地处理长列表,滚动很多。但是,如果我有包含 8 个项目的中等大小列表,则应用栏只会部分折叠,直到列
我有一个 SliverAppBar,向上滚动可缩小,向下滚动可展开。 我想在切换 BottomNavigationBar 时扩展 SliverAppBar。 当前情况下,SliverAppBar保持切
我已按照本教程 (https://medium.com/@diegoveloper/flutter-collapsing-toolbar-sliver-app-bar-14b858e87abe) 创建
我有一个 SliverAppBar( float :true,固定:false)。 我想实现的是,在 SliverAppBar 开始压缩/向上滑动之前,用户必须滚动 200 像素(或其他数量)。 最佳
当 AppBar 重新设置动画时(滚动条到达顶部后),SliverAppBar 无法显示内容。 下面包含一个示例项目来演示该问题。复制/粘贴下面的代码(将 rxdart 依赖项添加到 pubspec.
This is what I'm trying to do ,它是 iOS 上一个相当常见的 Widget。这是我的代码: return Scaffold( backgroundColor: Co
我正在使用 NestedScrollView在这里并试图放一个 TabBar在 bottom SliverAppBar 的参数内置于 headerSliverBuilder功能。 TabBar工作正常
我想在 Flutter 中添加自定义 SliverAppBar,如下所示 The SliverAppBar I want 但我只能做如下 The SliverAppBar I get在 https:/
我收到了 SliverAppBar与 AnimatedContainer里面。此动画容器的高度在运行时会发生变化,因此容器会对其大小进行动画处理。我的问题是,expandedHeight我的 Sliv
我对 Appbar 有这些要求,但我找不到解决它们的方法。 当拉伸(stretch) , AppBar 必须显示 两个图像一个在另一个之上并且标题必须隐藏。 当关闭 , AppBar 必须显示标题和
我在 Dribble 中发现了一些 Appbar 设计 https://dribbble.com/shots/9175650-Beauty-Salon-App/attachments/1218583?
我正在尝试在自定义应用栏下方显示一个灵活的 SliverAppBar(假设它是一个高度为 80.0 的容器)。 当将 SliverAppBar 设置为顶部元素时,它工作正常,但当它是第二个时,顶部填充
我显示来自网络的图像,它在滚动时缩小。我想显示没有填充或裁剪的整个图像。但是,如果我用 expandedHeight 注释行 - 没有图像 - 只有 appbar 及其高度。有没有什么小部件,可以根据
我是使用 flutter 的新手,当我编写我的应用程序时,我遇到了一个问题,即如何默认设置 SliverAppBar 折叠状态。为了解决我的困惑,我查看了 flutter 的文档,不幸的是我找不到解决
有没有人在SliverAppBar中使用过Gradient?当它展开时,我可以在 FlexibleSpace 中执行此操作,但当它折叠时,它会变成纯色。可以治疗吗? 最佳答案 在FlexibleSpa
在 Flutter 中,您可以使用 shape 属性在 AppBar 小部件中自定义形状,但此属性在 SliverAppBar 小部件中缺失 AppBar( title: Text('He
这是我的代码,复制自 here : SliverAppBar( expandedHeight: 150.0, flexibleSpace: const FlexibleSpaceBar(
我是一名优秀的程序员,十分优秀!