Флаттер на кране Отскок зафиксирован в одной позиции при прокрутке - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю On Tap Bounce функция на моем виджете. Я сослался на эти ссылки для получения информации:

Я получил этот пакет с именем bouncing_widget , который был достаточно хорош для обходного пути, но есть одно ограничение к нему, то есть Он не подходит для прокрутки виджета. Вы не можете прокрутить страницу, коснувшись виджета, который использует этот подпрыгивающий виджет флаттера

Кто-то уже создал ошибку для вышеуказанного виджета, и решение не найдено. Вот где вы можете найти проблему: Bouncing Widget GitHub Issue

Итак, я решил создать свой собственный виджет, который выполняет эту работу за меня. Я сделал виджет, и он работает нормально, но есть ограничение, то есть

Когда вы прокручиваете страницу, удерживая виджет, виджет остается там в одной фиксированной позиции, что означает как будто он остается в нажатом положении

Вот мой код:

import 'package:flutter/material.dart';

class CLBounceWidget extends StatefulWidget {
  final Function onPressed;
  final Widget child;

  CLBounceWidget({Key key, @required this.onPressed, @required this.child}): super(key:key);

  @override
  CLBounceWidgetState createState() => CLBounceWidgetState();
}

class CLBounceWidgetState extends State<CLBounceWidget> with SingleTickerProviderStateMixin{
  double _scale;
  final Duration duration = Duration(milliseconds: 200);
  AnimationController _animationController;

  //Getting onPressed Calback
  VoidCallback get onPressed => widget.onPressed;

  @override
  void initState() {
    _animationController = AnimationController(
      vsync: this,
      duration: duration,
      lowerBound: 0.0,
      upperBound: 0.1
    )..addListener((){ setState((){}); });

    super.initState();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _animationController?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    _scale = 1 - _animationController.value;
    return GestureDetector(
      onTapDown: _onTapDown,
      onTapUp: _onTapUp,
      child: Transform.scale(
        scale: _scale,
        child: widget.child
      )
    );
  }

  // Triggering the onPressed callback with a check
  void _onTapTrigger(){
    if(onPressed != null){
      onPressed();
    }
  }

  //Start the animation
  _onTapDown(TapDownDetails details){
    _animationController.forward();
  }

  // We revise the animation and notify the user of the event
  _onTapUp(TapUpDetails details){
    Future.delayed(Duration(milliseconds: 100), (){
      _animationController.reverse();
    });

    //Finally calling the callback function
    _onTapTrigger();
  }
}

Также: Я пытался сделать это, без использования Future, но с этим Анимация происходит только при длительном нажатии , просто _onTapTrigger () работает:

_onTapUp(TapUpDetails details){
  _animationController.reverse();
  _onTapTrigger();
}

Tried: Я пытался использовать onLongPress, onLongPressEnd, onLongPressMoveUpdate, чтобы хотя бы выполнить _animationController.reverse (); , но у меня ничего не получилось.

Любая помощь будет оценена. Я хочу, чтобы виджет оставался нормальным при прокрутке страницы, удерживая виджет, как это делает обычный виджет.

1 Ответ

0 голосов
/ 18 апреля 2020

С тех пор, как после долгих исследований, долгих и долгих трудов, я наконец-то узнал, что я хотел иметь в своем проекте. Я создал пакет на флаттере pub.dev , чтобы помочь другим разработчикам, которым требуется пакет flutter_bounce.

Вы можете найти flutter_bounce по вышеуказанной ссылке, или вы можете напрямую go к этому: flutter_bounce

Чтобы использовать его, вам просто нужно сделать это:

Bounce(
  duration: Duration(milliseconds: 110),
  onPressed: (){ YOUR_FUNCTION },
  child: YOUR_WIDGET
)

Для получения более подробной информации, пожалуйста, прочитайте README ссылки. В нем есть все необходимые детали. Удачного кодирования:)

...