Flutter — использование Dismissible при просмотре страницы создает уродливую анимацию

#flutter #dart #flutter-pageview #dismissible

#трепетание #dart #flutter-просмотр страницы #dismissible

Вопрос:

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

Как я могу создать плавную анимацию удаления с помощью просмотра страницы? Если это невозможно через просмотр страницы, есть ли какая-либо альтернатива, которая имеет функцию «привязки карт»?

Вот мой код:

 class SwipeScreen extends StatefulWidget {
  const SwipeScreen({Key key}) : super(key: key);

  static const routeName = '/swipe';

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

class _SwipeScreenState extends State<SwipeScreen> {
  List<String> content = ['one', 'two', 'three', 'four', 'five'];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView.builder(
        scrollDirection: Axis.vertical,
        itemCount: content.length,
        controller: PageController(viewportFraction: 0.8),
        itemBuilder: (context, index) {
          return Dismissible(
            key: ValueKey(content[index]),
            child: Card(
              child: Container(
                height: MediaQuery.of(context).size.height * 0.8,
                child: Text('test'),
              ),
            ),
            onDismissed: (direction) {
              setState(() {
                content = List.from(content)..removeAt(index);
              });
            },
          );
        },
      ),
    );
  }
}
  

Комментарии:

1. Привет, я не вижу ни одного виджета просмотра страницы в вашем примере. Код, которым вы поделились, хорошо работает для меня.

2. Привет, извините за это. -ошибка копирования-вставки. Отредактировал его только что.

Ответ №1:

Замена PageView.builder() на ListView.builder() создаст более плавную анимацию.

Надеюсь, это то, что вы ищете!

Комментарии:

1. Спасибо за ответ. Причина, по которой я использую просмотр страницы, заключается в том, что он имеет функцию привязки. Так что карта всегда будет в центре экрана. Есть ли какая-либо возможность добиться этого и с помощью ListView?

Ответ №2:

К сожалению, PageView виджет не предназначен для использования с Dismissible виджетом, поскольку анимация при завершении удаления не реализована.

Вы все равно можете изменить свой просмотр страницы на a ListView и установить физику PageScrollPhysics() , чтобы анимация была отключена, но вы, вероятно, столкнетесь с некоторыми другими проблемами с размерами виджетов

Комментарии:

1. Эй, PageScrollPhysics выглядит довольно многообещающе. Просто чтобы убедиться, что я полностью понимаю ваш комментарий: как вы думаете, приложение столкнется с проблемами производительности в некоторые моменты? Или вы просто имеете в виду, что сам виджет будет очень сложным?

2. Виджет может быть сложным для получения того же поведения, что и просмотр страницы при прокрутке событий. Когда вы отклоняете элемент в середине списка, положение прокрутки может быть сдвинуто

3. Есть идеи по решению проблемы? С моей точки зрения, это должно происходить только в начале и конце списка. Может ли это быть решением сделать список бесконечным или как карусель? — Значение: если достигнут последний элемент, он снова должен указывать на первый. Может быть, где-то существует плагин, который уже это делает? Я только что нашел пакет swiper (довольно глючный) и пакет carousel (не удалось его анимировать правильно).

4. Я не знаю, это зависит от того, что именно вы хотите. в любом случае, я думаю, вы могли бы найти способ без использования пакета. Может быть, вы могли бы снова обратиться к просмотру страницы и реализовать анимацию confirmDismiss метода для вашей плитки и уменьшить ее размер? Удачи 🙂

5. До сих пор это не работало. Я попробовал несколько разных подходов, но до сих пор безуспешно. Я не смог запустить анимацию для confirmDismiss. Может быть, кто-нибудь знает, как этого можно достичь?