【发布时间】:2021-10-07 19:33:41
【问题描述】:
问题
所以我在 SingleChildScrollView 中有一个 GestureDetector 小部件(滚动视图是为了适应较小的屏幕)。 GestureDetector 正在监听平移更新。
当 SingleChildScrollView 处于“使用中”时,GestureDetector 无法接收平移更新,因为来自用户的“拖动”输入被转发到 SingleChildScrollView。
我想要什么
在 GestureDetector 上方拖动时,使子 GestureDetector 优先于 SingleChildScrollView ——但仍具有在 GestureDetector 之外滚动 SingleChildScrollView 的功能。
示例
如果您将此代码复制/粘贴到dart pad,您就会明白我的意思。当渐变容器很大时,SingleChildScrollView 不活动——您可以拖动蓝色框并在控制台中查看更新。但是,一旦您按下切换按钮,容器就会变小,并且 SingleChildScrollView 会变为活动状态。您现在无法再在只能滚动容器的控制台中获取平移更新。
旁注:如果您快速拖动蓝色框,您似乎可以获得拖动更新,但缓慢拖动它只会滚动容器。我不确定这是错误还是功能,但我无法在我的生产应用程序中重现相同的结果。
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatefulWidget {
const MyWidget({Key? key}) : super(key: key);
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
bool enabled = false;
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SizedBox(
height: enabled ? 200 : 400,
child: SingleChildScrollView(
child: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment(0.8, 0.0),
colors: <Color>[Color(0xffee0000), Color(0xffeeee00)],
tileMode: TileMode.repeated,
),
),
height: 400,
width: 200,
child: Center(
child: GestureDetector(
onPanUpdate: (details) => print(details),
child: Container(
height: 100,
width: 100,
color: Colors.blue,
child: Center(
child: Text(
"Drag\nme",
textAlign: TextAlign.center,
),
),
),
),
),
),
),
),
ElevatedButton(
onPressed: () => setState(() {
enabled = !enabled;
}),
child: Text("Switch"))
],
);
}
}
【问题讨论】:
-
this answer 有帮助吗?
-
@PatrickMahomes 谢谢——我有点老套,但似乎可以解决问题!