Я написал следующий код, который заставляет контейнер перемещаться влево, когда пользователь этого хочет.
я использовал здесь GestureDetector
onPanUpdate
для обработки свайпа влево
также я использовал onPanEnd
, чтобы вернуть контейнер в его местоположение по умолчанию, сбросив мой глобальный double swipH varible to
0` и то же самое с вертикальным
import 'package:flutter/material.dart';
double swipH = 0 ;
double swipV = 0 ;
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
@override
State<App> createState() => _AppState();
}
class _AppState extends State<App> {
bool isV = true ;
bool isH = true ;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onLongPress: (){
debugPrint('vvvvvvvvv');
},
onPanUpdate:(noti){
if(noti.delta.dy < 0&&isV){
isH = false;
swipV += noti.delta.dy;
setState(() {});
}
if(noti.delta.dx < 0&&isH){
isV = false;
debugPrint('Started');
swipH += noti.delta.dx;
setState(() {});
}
},
onPanEnd:(noti){
isV = true ;
isH = true ;
swipH=0;
swipV = 0 ;
setState(() {});
},
child: Transform.translate(
offset: Offset(swipH, swipV),
child: Container(
padding: const EdgeInsets.all(8),
height: 200,
width: MediaQuery.of(context).size.width / 2,
color: Colors.red,
),
),
),
],
),
),
);
}
}
РЕДАКТИРОВАТЬ извините, я забыл включить следующее
onLongPress: (){
debugPrint('onLongPress');
},
любая хорошая идея вместо этого приветствуется
все работает нормально без использования onLongPress
.. но мне нужен этот метод с той же логикой в примере
сделано, пожалуйста, посмотрите
я тоже редактирую код
Мы можем использовать другой bool?
для отслеживания начального направления движения и проверки сопротивления.
double swipH = 0;
double swipV = 0;
class App extends StatefulWidget {
const App({Key? key}) : super(key: key);
@override
State<App> createState() => _AppState();
}
class _AppState extends State<App> {
bool? _isDx;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onPanUpdate: (noti) {
if (noti.delta.dy < 0 && _isDx != false) {
swipV += noti.delta.dy;
_isDx = true;
}
if (noti.delta.dx < 0 && _isDx != true) {
swipH += noti.delta.dx;
_isDx = false;
}
setState(() {});
},
onPanEnd: (noti) {
debugPrint('end');
swipH = 0;
swipV = 0;
_isDx = null;
setState(() {});
},
child: Transform.translate(
offset: Offset(swipH, swipV),
child: Container(
padding: const EdgeInsets.all(8),
height: 200,
width: MediaQuery.of(context).size.width / 2,
color: Colors.red,
),
),
),
],
),
),
);
}
}
вы уверены, что видите полный вопрос Изменить?
хорошо, я видел последний i want only one side in every single swipe
😅 и приступаю к решению, увидев изображение, можете ли вы предоставить GIF или с какой проблемой вы столкнулись из этого поста
без сомнения, вы решили проблему ... но когда я использую длительное нажатие на каждую логику в моем примере, а ваш пример не работает должным образом ... это была моя настоящая проблема
Вы можете попробовать вызвать onLongPressMoveUpdate
я решил это с помощью Listener Widget .. он уже подходит для GtDetctor
Можете ли вы предоставить GIF или изображение о вашем желаемом выходе? Я не получаю
only one side in every single swipe