-
Notifications
You must be signed in to change notification settings - Fork 29.7k
Description
Is there an existing issue for this?
- I have searched the existing issues
- I have read the guide to filing a bug
Steps to reproduce
I have a NestedScrollViewwith a SliverAppBar, and a CustomScrollView as a child. Inside the CustomScrollView, if I use a SliverList.builder everything works fine, but if I use a SliverList.listthe scroll doesn't work. This only happens with the normal SliverAppBar. If you use a SliverAppBar.mediumor a SliverAppBar.large, both SliverLists works fine.
Expected results
Scrolling with SliverList.listshould scroll as it does SliverList.builder.
Actual results
SliverList.builder scrolls but SliverList.listdoesn't.
Code sample
In case you wonder why I want to use a SliverList.list instead of a SliverList.builder it's because I want to build a settings screen, with a list of different options. The list is built with widgets with different structures, it's not a list with the same widget but with different data, so that's why I want to use a normal SliverList.list instead a SliverList.builder.
Code sample
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: _title,
theme: ThemeData(
useMaterial3: true
),
home: const MyStatelessWidget(),
);
}
}
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar(
title: const Text("Title"),
pinned: true,
floating: true,
centerTitle: false,
forceElevated: innerBoxIsScrolled,
),
),
];
},
body: SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverList.list(
children: [
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
ListTile(
title: const Text("List tile"),
subtitle: const Text("Navigate to second screen"),
onTap: () => Navigator.push(context, MaterialPageRoute(
builder: (context) => const SecondScreen()
)),
),
]
),
// SliverList.builder(
// itemCount: 30,
// itemBuilder: (context, index) => ListTile(
// title: Text("List tile $index"),
// subtitle: const Text("Navigate to second screen"),
// onTap: () => Navigator.push(context, MaterialPageRoute(
// builder: (context) => const SecondScreen()
// )),
// )
// )
],
),
)
)
),
);
}
}
class SecondScreen extends StatefulWidget {
const SecondScreen({Key? key}) : super(key: key);
@override
State<SecondScreen> createState() => _SecondScreenState();
}
class _SecondScreenState extends State<SecondScreen> {
int count = 30;
@override
Widget build(BuildContext context) {
return Scaffold(
body: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) => [
SliverOverlapAbsorber(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
sliver: SliverAppBar.large(
leading: IconButton(
onPressed: () => Navigator.pop(context),
icon: const Icon(Icons.close)
),
pinned: true,
floating: true,
centerTitle: false,
forceElevated: innerBoxIsScrolled,
title: const Text("Second screen"),
actions: [
IconButton(
onPressed: () => setState(() => count++),
icon: const Icon(Icons.add)
),
const SizedBox(width: 10)
],
),
)
],
body: SafeArea(
top: false,
bottom: false,
child: Builder(
builder: (context) => CustomScrollView(
slivers: [
SliverOverlapInjector(
handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
),
SliverList.builder(
itemCount: count,
itemBuilder: (context, index) => ListTile(
title: Text("Item $index"),
),
)
],
),
)
),
),
);
}
}Screenshots or Video
Screenshots / Video demonstration
scroll-issue.mp4
Logs
No response
Flutter Doctor output
Doctor output
[✓] Flutter (Channel stable, 3.10.1, on macOS 13.3.1 22E772610a darwin-arm64, locale es-ES)
• Flutter version 3.10.1 on channel stable at /Users/juan/flutter
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision d3d8effc68 (4 days ago), 2023-05-16 17:59:05 -0700
• Engine revision b4fb11214d
• Dart version 3.0.1
• DevTools version 2.23.1
[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
• Android SDK at /Users/juan/Library/Android/sdk
• Platform android-33, build-tools 31.0.0
• ANDROID_HOME = /Users/juan/Library/Android/sdk
• Java binary at: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
• Java version OpenJDK Runtime Environment (build 11.0.15+0-b2043.56-8887301)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 14.3)
• Xcode at /Applications/Xcode.app/Contents/Developer
• Build 14E222b
• CocoaPods version 1.11.2
[✓] Chrome - develop for the web
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Android Studio (version 2022.1)
• Android Studio at /Applications/Android Studio.app/Contents
• Flutter plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
🔨 https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build 11.0.15+0-b2043.56-8887301)
[✓] VS Code (version 1.78.2)
• VS Code at /Applications/Visual Studio Code.app/Contents
• Flutter extension version 3.60.0
[✓] Connected device (4 available)
• sdk gphone64 arm64 (mobile) • emulator-5554 • android-arm64 • Android 13 (API 33) (emulator)
• sdk gphone64 arm64 (mobile) • emulator-5556 • android-arm64 • Android 12 (API 31) (emulator)
• macOS (desktop) • macos • darwin-arm64 • macOS 13.3.1 22E772610a darwin-arm64
• Chrome (web) • chrome • web-javascript • Google Chrome 113.0.5672.126
[✓] Network resources
• All expected network resources are available.
• No issues found!```
</details>