Как предотвратить одновременное перемещение анимированных виджетов во Flutter ListView - PullRequest
0 голосов
/ 04 мая 2019

У меня проблема с тем, что я начал добавлять ведущие значки в плитки списка, а затем захотел их анимировать. Я был в состоянии следовать анимации учебник достаточно, чтобы заставить их начать анимацию onTap, но все они анимируются вместе. Как мне сделать их уникальными? Я пытался передать ключ конструктору AnimatedWidget, но это не помогло.

Вот код, который демонстрирует мою текущую проблему. Если вы нажмете, все они повернутся на 90 градусов, а если вы продолжите нажимать, они оживят назад на 90 градусов

import 'package:flutter/material.dart';
import 'dart:math';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  int _counter = 0;
  AnimationController controller;
  Animation animation;

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();

    controller =
        AnimationController(duration: const Duration(milliseconds: 285), vsync: this);
    animation = Tween<double>(begin: 0, end: pi/2).animate(controller);

  }


  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
            child: ListView(
              children: ListTile.divideTiles(
                context: context,
                tiles: [
                  ListTile(
                    leading: AnimatedChevron(animation: animation),
                    onTap: ()=> controller.forward(),
                    onLongPress: ()=> controller.reverse(),
                    title: Text('Sun'),
                  ),
                  ListTile(
                    leading: AnimatedChevron(animation: animation),
                    onTap: ()=> controller.forward(),
                    onLongPress: ()=> controller.reverse(),
                    title: Text('Moon'),
                  ),
                  ListTile(
                    leading: AnimatedChevron(animation: animation),
                    onTap: ()=> controller.forward(),
                    onLongPress: ()=> controller.reverse(),
                    title: Text('Star'),
                  ),
                ],
              ).toList(),
            ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class AnimatedChevron extends AnimatedWidget {
  AnimatedChevron({Key key, Animation<double> animation})
      : super(key: key, listenable: animation);

  Widget build(BuildContext context) {
    final Animation<double> animation = listenable;
    return Transform.rotate(
        angle: animation.value,
        child: Icon(Icons.chevron_right, color: Colors.blue));
  }
}

enter image description here

Еще один отличный учебник по списку Я использовал здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...