body: SingleChildScrollView(
child: Column(
children: [
Container(
color: Colors.redAccent[200],
height: 1000.0,
width: 500.0,
alignment: Alignment.center,
),
GestureDetector(
onVerticalDragUpdate: (DragUpdateDetails details) {
print("Start");
print(details.localPosition);
},
child: Container(
color: Colors.blueAccent[200],
height: 10000.0,
width: 500.0,
alignment: Alignment.center,
),
)
],
),
)
onVerticalDragUpdate
正在阻止SingleChildScrollView
滚动,因为它只是检测到垂直拖动更新,当您通过握住窗口小部件时,它会忽略滚动浏览器并收听窗口小部件的可拖动更新。 运行以下代码。现在对我有用。
body: SingleChildScrollView(
child: Column(
children: [
Container(
color: Colors.redAccent[200],
height: 1000.0,
width: 500.0,
alignment: Alignment.center,
),
GestureDetector(
// onVerticalDragUpdate: (DragUpdateDetails details) {
// print("Start");
// print(details.localPosition);
// },
child: Container(
color: Colors.blueAccent[200],
height: 1000.0,
width: 500.0,
alignment: Alignment.center,
),
)
],
),
)
一种方法是使用
scrollController
并手动更新它。不利的一面是,这样,您会失去滚动减速效果(用户摘下手指滚动会稍微继续)。我想也可以手动实施减速效应。
class _MyHomePageState extends State<MyHomePage> {
late ScrollController _scrollController;
@override
void initState() {
super.initState();
_scrollController = ScrollController();
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
controller: _scrollController,
child: Column(
children: List.generate(
20,
(i) => i == 10 ? GestureDetector(onVerticalDragUpdate: _onVerticalDragUpdate, child: _c(i)) : _c(i),
)),
),
);
}
void _onVerticalDragUpdate(DragUpdateDetails details) {
_scrollController.jumpTo(
(_scrollController.offset - details.delta.dy).clamp(
0.0,
_scrollController.position.maxScrollExtent,
),
);
}
Widget _c(int i) => Container(
margin: EdgeInsets.all(2.0),
height: 100,
color: Colors.amber,
child: Center(child: Text("$i")),
);
}
trory用单核crollview包裹格鲁德泰克人。