我有父SCS视图(SingleChildScrollView)和子SCS视图。在子SCS视图中有一个数据表,数据表大约从屏幕的下四分之一开始。
现在,当用户滚动到子SCS视图中的数据表顶部时,我希望滚动父SCS视图。
这在网络中是自然的,但在iOS或anroid中不起作用。我尝试在父级和子级SCS视图中使用相同的滚动控制器,并使用ScrollPhysics。但似乎什么都起不到作用。你能帮我解决这个问题吗。
以下是代码:
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Report'),
),
),
),
);
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
final ScrollController scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: [
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
ConstrainedBox(
constraints: BoxConstraints(
maxHeight: 400,
),
child: Scrollbar(
controller: scrollController,
child: SingleChildScrollView(
controller: scrollController,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
columns: [
DataColumn(label: Text('Sl. No.')),
DataColumn(label: Text('Resource Name')),
DataColumn(label: Text('Score at 1')),
DataColumn(label: Text('Score at 2')),
DataColumn(label: Text('Final Score')),
],
rows: [
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
],
),
),
),
),
)
],
),
);
}
}谢谢。
发布于 2021-09-15 01:34:42
您可以使用NotificationListener侦听OverscrollNotification来检测嵌套列表的上边界命中,并通过控制滚动到外部滚动视图。
我将您的问题简化为下面的示例代码:
class MyNestedListView extends StatefulWidget {
const MyNestedListView({Key? key}) : super(key: key);
@override
_MyNestedListViewState createState() => _MyNestedListViewState();
}
class _MyNestedListViewState extends State<MyNestedListView> {
final _controller = ScrollController();
@override
Widget build(BuildContext context) {
return ListView(
controller: _controller,
children: [
Placeholder(fallbackHeight: 400),
Placeholder(fallbackHeight: 400),
Placeholder(fallbackHeight: 400),
Container(
padding: EdgeInsets.symmetric(horizontal: 20),
height: 400,
child: NotificationListener(
onNotification: (notification) {
// disable overscroll indicator
// if (notification is OverscrollIndicatorNotification) {
// if (notification.leading) {
// notification.disallowGlow();
// }
// }
if (notification is OverscrollNotification) {
final dy = notification.overscroll;
if (dy < 0) {
_controller.position.jumpTo(_controller.offset + dy);
}
}
return true;
},
child: ListView(
children: [
Placeholder(fallbackHeight: 200),
Placeholder(fallbackHeight: 200),
Placeholder(fallbackHeight: 200),
Placeholder(fallbackHeight: 200),
],
),
),
)
],
);
}
@override
void dispose() {
super.dispose();
_controller.dispose();
}
}发布于 2021-08-29 07:09:57
编辑的
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:so_test/screen/video_player.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
UniqueKey _key = UniqueKey();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: Test(),
);
}
}
class Test extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _TestState();
}
}
class _TestState extends State<Test> {
final ScrollController scrollController = ScrollController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ListView(
shrinkWrap: true,
physics: ScrollPhysics(),
children: [
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Text('Some Data', style: TextStyle(fontSize: 30)),
Scrollbar(
controller: scrollController,
child: SingleChildScrollView(
controller: scrollController,
physics: NeverScrollableScrollPhysics(),
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable(
columns: [
DataColumn(label: Text('Sl. No.')),
DataColumn(label: Text('Resource Name')),
DataColumn(label: Text('Score at 1')),
DataColumn(label: Text('Score at 2')),
DataColumn(label: Text('Final Score')),
],
rows: [
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
DataRow(
cells: [
DataCell(Text('1')),
DataCell(Text('Person 1')),
DataCell(Text('5')),
DataCell(Text('2')),
DataCell(Text('8')),
],
),
],
),
),
),
)
],
),
),
);
}
}https://stackoverflow.com/questions/68970390
复制相似问题