[SOLVED] ListView in flutter with shuffle animation

Issue

This Content is from Stack Overflow. Question asked by Mosh Mobile Software Engineer

So in my flutter screen I have these tiles that is each tile has a letter in it. My plan there that these tiles must be expected to be shuffled when the button is click. Currently, I just have little knowledge in regarding with Flutter animation. I need your help guys.

Tiles

Example of shuffle animation
PS: this picture is not mine. I just want to upload this so then you have idea what does shuffle animation do in my tiles.

Shuffle animation



Solution

You can try this (DartPad) :

import 'package:flutter/material.dart';

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

class MyApp extends StatefulWidget {

  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  final String word = "TRIPLE";
  final double size = 170;
  final double space = 10;

  late final List<Color> colors = Colors.primaries
  .take(word.length)
  .map((MaterialColor m) => m.shade800)
  .toList();
  late final int containerNumber = word.length;
  late final List<Rect> positions = List.generate(
    containerNumber, 
    (index) => getRectangle(index, containerNumber, size)
  );

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Material App Bar'),
        ),
        body: Center(
          child: SingleChildScrollView(
            child: Column(
              mainAxisSize: MainAxisSize.max,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                const SizedBox(height: 50,),
                ElevatedButton(
                  onPressed: shuffle, 
                  child: const Text("Shuffle")
                ),
                const SizedBox(height: 50,),
                SizedBox(
                  height: containerNumber ~/3 * (size+space) - space,
                  width: 3 * (size+space) - space,
                  child: Stack(
                    fit: StackFit.loose,
                    alignment: Alignment.center,
                    children: List.generate(containerNumber, (index) {
                      return AnimatedPositioned.fromRect(
                        rect: positions[index],
                        duration: const Duration(milliseconds: 500),
                        child: Container(
                          alignment: Alignment.center,
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(20),
                            color: colors[index],
                          ),
                          width: size,
                          height: size,
                          child: Text(
                            word[index],
                            style: const TextStyle(
                              fontSize: 60,
                              fontWeight: FontWeight.w900,
                              color: Colors.white
                            ),
                          ),
                        ),
                      );
                    }),
                  )
                ),
              ] 
            ),
          )
        )
      ),
    );
  }

  Rect getRectangle(int index, int length, double size) {
    return 
      Offset(index % 3 * (size + space), index ~/3 * (size + space)) 
      & Size.square(size);
  }
  
  void shuffle() {
    setState(() {
      positions.shuffle();
    });
  }
}


This Question was asked in StackOverflow by Mosh Mobile Software Engineer and Answered by TripleNine It is licensed under the terms of CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.

people found this article helpful. What about you?