Repository navigation
<ScrollController attached to multiple scroll views> while navigating to back to a page with scrollController #74372
Description
I have a need, please watch the video.
1611197989633759.mp4
When the list is sliding, the top Widget(blue container) transparency will change according to the offset.
Tabar and TabarView(red container) will be nested in the list, and need tabController. So TickerProviderStateMixin is mixed in. When a new page is pushed, the program is abnormal.
controller.offset triggered assert(_positions.length == 1,'ScrollController attached to multiple scroll views.'); in scroll_controller.dart line 113
Code
code sample
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MainPage(),
);
}
}
class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> with TickerProviderStateMixin {
ScrollController _scrollController;
@override
void initState() {
super.initState();
_scrollController = ScrollController();
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
print('MainPage: ${_scrollController.positions}');
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.black,
title: Text('Demo'),
actions: [
CupertinoButton(
child: Text('Page 1'),
onPressed: () {
Navigator.of(context).push(CupertinoPageRoute(builder: (context) {
return Page1();
}));
},
)
],
),
body: NestedScrollView(
controller: _scrollController,
headerSliverBuilder: (context, _) {
return [
OpacityView(
controller: _scrollController,
)
];
},
body: Container(
height: 1000,
color: Colors.red,
),
),
);
}
}
class OpacityView extends AnimatedWidget {
OpacityView({Key key, this.controller})
: super(key: key, listenable: controller);
final ScrollController controller;
@override
Widget build(BuildContext context) {
double opacity = 1;
print('OpacityView: ${controller.positions}');
opacity = 1 - (controller.offset / 200).clamp(0, 1);
return SliverToBoxAdapter(
child: Opacity(
opacity: opacity,
child: Container(
height: 200,
color: Colors.blue,
),
),
);
}
}
class Page1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page 1'),
backgroundColor: Colors.black,
),
);
}
}Output
-
first run
flutter: MainPage: []
flutter: OpacityView: [_NestedScrollPosition#f0583(outer, offset: 0.0, range: null..null, viewport: null)] -
pushed page1
flutter: MainPage: [_NestedScrollPosition#f0583(outer, offset: 0.0, range: 0.0..200.0, viewport: 712.0)]
flutter: OpacityView: [_NestedScrollPosition#f0583(outer, offset: 0.0, range: 0.0..200.0, viewport: 712.0), _NestedScrollPosition#152a0(outer, offset: 0.0, range: 0.0..200.0, viewport: 712.0)]
Exception
The following assertion was thrown building OpacityView(animation: ScrollController#35d66(2 clients), dirty, state: _AnimatedState#364a5):
ScrollController attached to multiple scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 113 pos 12: '_positions.length == 1'
Flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 1.22.5, on macOS 11.0.1 20B29 darwin-x64, locale
zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 12.2)
[!] Android Studio (version 4.1)
✗ Flutter plugin not installed; this adds Flutter specific functionality.
✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.52.1)
[✓] Connected device (1 available)
! Doctor found issues in 1 category.
Activity
pedromassangocode commentedon Jan 21, 2021
logs
[ +30 ms] I/flutter ( 6595): OpacityView: [_NestedScrollPosition#dfa94(outer, offset: 0.0, range: 0.0..200.0, viewport: 679.3), _NestedScrollPosition#18d92(outer, offset: 0.0, range: 0.0..200.0, viewport: 679.3)] [ +237 ms] ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ The following assertion was thrown building OpacityView(animation: ScrollController#998ed(2 clients), dirty, state: _AnimatedState#ee7f8): ScrollController attached to multiple scroll views. 'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 109 pos 12: '_positions.length == 1' Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause. In either case, please report this assertion by filing a bug on GitHub: https://github.com/flutter/flutter/issues/new?template=2_bug.md The relevant error-causing widget was: OpacityView file:///Users/pedromassango/dev/Projects/flutter_example/lib/main.dart:64:13 When the exception was thrown, this was the stack: #2 ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:109:12) #3 ScrollController.offset (package:flutter/src/widgets/scroll_controller.dart:116:24) #4 OpacityView.build (package:flutter_example/main.dart:88:31) #5 _AnimatedState.build (package:flutter/src/widgets/transitions.dart:174:48) #6 StatefulElement.build (package:flutter/src/widgets/framework.dart:4742:27) #7 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4625:15) #8 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #9 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #10 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #11 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #12 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5633:32) #13 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6235:17) #14 _ViewportElement.update (package:flutter/src/widgets/viewport.dart:228:11) #15 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #16 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #18 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #19 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #20 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #21 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #22 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #23 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #24 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #25 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #26 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #27 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #28 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #29 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #30 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #31 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #32 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #33 ProxyElement.update (package:flutter/src/widgets/framework.dart:4973:5) #34 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #35 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #36 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #37 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #38 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #39 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #40 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #41 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #42 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #43 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #44 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #45 StatelessElement.update (package:flutter/src/widgets/framework.dart:4706:5) #46 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #47 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #48 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #49 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #50 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #51 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #52 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #53 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #54 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #55 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #56 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #57 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #58 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #59 StatelessElement.update (package:flutter/src/widgets/framework.dart:4706:5) #60 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #61 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #62 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #63 StatelessElement.update (package:flutter/src/widgets/framework.dart:4706:5) #64 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #65 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #66 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #67 ProxyElement.update (package:flutter/src/widgets/framework.dart:4973:5) #68 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #69 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #70 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #71 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #72 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #73 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #74 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #75 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #76 StatelessElement.update (package:flutter/src/widgets/framework.dart:4706:5) #77 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #78 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #79 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #80 ProxyElement.update (package:flutter/src/widgets/framework.dart:4973:5) #81 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #82 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #83 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #84 ProxyElement.update (package:flutter/src/widgets/framework.dart:4973:5) #85 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #86 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5633:32) #87 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6235:17) #88 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #89 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #90 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #91 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #92 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #93 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #94 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #95 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #96 ProxyElement.update (package:flutter/src/widgets/framework.dart:4973:5) #97 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #98 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #99 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #100 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #101 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #102 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #103 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #104 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #105 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #106 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #107 StatelessElement.update (package:flutter/src/widgets/framework.dart:4706:5) #108 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #109 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6111:14) #110 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #111 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #112 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #113 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #114 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #115 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #116 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #117 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #118 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #119 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #120 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #121 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #122 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #123 ProxyElement.update (package:flutter/src/widgets/framework.dart:4973:5) #124 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #125 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #126 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #127 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #128 StatefulElement.update (package:flutter/src/widgets/framework.dart:4829:5) #129 Element.updateChild (package:flutter/src/widgets/framework.dart:3293:15) #130 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4650:16) #131 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4797:11) #132 Element.rebuild (package:flutter/src/widgets/framework.dart:4319:5) #133 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2694:33) #134 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:873:21) #135 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:319:5) #136 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15) #137 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1082:9) #138 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:998:5) #142 _invoke (dart:ui/hooks.dart:157:10) #143 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:253:5) #144 _drawFrame (dart:ui/hooks.dart:120:31) (elided 5 frames from class _AssertionError and dart:async) ════════════════════════════════════════════════════════════════════════════════════════════════════ [ +49 ms] Another exception was thrown: A RenderNestedScrollViewViewport expected a child of type RenderSliver but received a child of type RenderErrorBox. [ +39 ms] Another exception was thrown: A RenderNestedScrollViewViewport expected a child of type RenderSliver but received a child of type RenderErrorBox.flutter doctor -v
[-]NestedScrollView + ScrollController + TickerProviderStateMixin abnormal behavior.[/-][+]ScrollController attached to multiple scroll views.[/+]nt4f04uNd commentedon Jan 21, 2021
well, there's so question been asked a loong time ago https://stackoverflow.com/questions/53824944/flutter-exception-scrollcontroller-attached-to-multiple-scroll-views
@pedromassangocode the problem here is that for some reason scroll position gets duplicated when navigator pushes route, maybe the issue title should be changed?
@HaijunWei by the way, don't use
Opacityfor animations, there's specially madeFadeTransitionHaijunWei commentedon Jan 22, 2021
Okay, thank you, I now use SliverPersistentHeader to solve the problem. Should i close this issue?
pedromassangocode commentedon Jan 22, 2021
Not yet. I do think this is a valid issue.
tiloc commentedon Apr 13, 2021
+1 I think instead of being pointed to complex workarounds, the framework should by itself not run into this issue. I am getting this without any explicit ScrollController at all, merely by wrapping a bit of AnimatedSwitcher, a Scrollbar and a SingleChildScrollView. Now trying to untangle it in a fashion that will no longer produce this exception.
[-]ScrollController attached to multiple scroll views.[/-][+]<ScrollController attached to multiple scroll views> while navigating to back to a page with scrollController[/+]pedromassangocode commentedon Apr 14, 2021
Cc @Piinks @xu-baolin
xu-baolin commentedon Apr 14, 2021
Will take a look, thanks for mention :)
xu-baolin commentedon Apr 16, 2021
I have posted a PR #80573 to try to fix this.
deakjahn commentedon May 17, 2021
I have the very same error with a
CupertinoTabBar, just trying to switch between the pages of aPageView. (Nothing fancy, just callingcontroller.animateToPage()from the tabbar'sitemChanged).pedromassangocode commentedon May 17, 2021
Hi @deakjahn
This seems to be a different issue, can you please file a new issue? Please make sure to fill the issue template!
deakjahn commentedon May 17, 2021
I don't yet know, it might be the special scaffold or some interaction. I'll try to figure it out.
deakjahn commentedon May 18, 2021
Did it at #82846.
github-actions commentedon Aug 1, 2021
This thread has been automatically locked since there has not been any recent activity after it was closed. If you are still experiencing a similar issue, please open a new bug, including the output of
flutter doctor -vand a minimal reproduction of the issue.