【问题标题】:how to capture gesture start outside from screen from left to right in Flutter如何在 Flutter 中从屏幕从左到右捕捉手势开始
【发布时间】: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右后动作?

我尝试过的:

  1. 如果x起始位置为0,从左边开始?但不行,手势动作没有触发

  2. 添加onTapDown and onTapUp,还是不行,没有触发。

我已经阅读了官方文档,但没有列出情况。我应该怎么做才能从左到右捕获屏幕外的滑动动作?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    如果您从左到右检测 为什么你有从右到左的条件?

    if (offsetDifference > 0) {}
    

    你应该有:

    if (offsetDifference < 0) {}
    

    【讨论】:

    • 这是已经实现的,我想从屏幕外捕捉幻灯片开始。 @知识之人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多