【发布时间】:2020-10-11 07:13:54
【问题描述】:
我希望用户向右滑动以关闭文章详细信息页面并返回 Flutter 中的文章列表页面。现在我正在使用 GestureDetector 并且可以成功捕获向右滑动的手势。这是我的代码:
import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_html/style.dart';
import 'package:flutter_icons/flutter_icons.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:Cruise/src/component/part_snippet.dart';
import 'package:Cruise/src/common/helpers.dart';
import 'package:Cruise/src/models/Item.dart';
import 'package:Cruise/src/page/profile.dart';
import 'package:Cruise/src/common/Repo.dart';
import 'package:url_launcher/url_launcher.dart';
final partsProvider = FutureProvider.family((ref, int id) async {
return await Repo.fetchItem(id);
});
class StoryInformation extends HookWidget {
const StoryInformation({
Key key,
@required this.item,
}) : super(key: key);
final Item item;
void launchUrl(url) async {
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}
@override
Widget build(BuildContext context) {
final parts = item.parts.map((i) => useProvider(partsProvider(i))).toList();
Offset _initialSwipeOffset;
Offset _finalSwipeOffset;
void _onHorizontalDragStart(DragStartDetails details) {
_initialSwipeOffset = details.globalPosition;
}
void _onHorizontalDragUpdate(DragUpdateDetails details) {
_finalSwipeOffset = details.globalPosition;
}
void _onHorizontalDragEnd(DragEndDetails details) {
if (_initialSwipeOffset != null) {
final offsetDifference = _initialSwipeOffset.dx - _finalSwipeOffset.dx;
final direction = offsetDifference > 0 ? print('left') : print('right');
if (offsetDifference > 0) {
// detect the right gesture, then back to main list page
}
}
}
return Container(
color: Theme.of(context).scaffoldBackgroundColor,
child: GestureDetector(
onHorizontalDragStart: _onHorizontalDragStart,
onHorizontalDragUpdate: _onHorizontalDragUpdate,
onHorizontalDragEnd: _onHorizontalDragEnd,
child: Padding(),
),
)
}
它工作正常。但是有一个严重的问题:当用户从屏幕左外向右滑动时,手势不会触发,所以用户必须从头到尾在屏幕内做正确的手势。这个体验很连贯。如何让它可以捕捉到左屏外的手势,比如ios silde右后动作?
我尝试过的:
-
如果x起始位置为0,从左边开始?但不行,手势动作没有触发
-
添加
onTapDown and onTapUp,还是不行,没有触发。
我已经阅读了官方文档,但没有列出情况。我应该怎么做才能从左到右捕获屏幕外的滑动动作?
【问题讨论】:
标签: flutter