Skeleton loading in Flutter con skeletonizer

Mattepuffo's logo
Skeleton loading in Flutter con skeletonizer

Skeleton loading in Flutter con skeletonizer

skeletonizer è un package per Flutter che ci permette di creare un loading skeleton.

Nelle app moderne è abbastanza comune ormai.

In questo articolo vediamo un esempio basico.

I dati sono una semplice lista fittizia, e l'abilitazione dello skeleton dipende da un timer.

Per installarlo:

flutter pub add skeletonizer

Qui sotto il codice:

import 'dart:async';

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

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _enabled = true;

  @override
  void initState() {
    super.initState();
    Timer(const Duration(seconds: 5), _handleEnabled);
  }

  void _handleEnabled() {
    setState(() {
      _enabled = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Skeletonizer(
        enabled: _enabled,
        child: ListView.builder(
          itemCount: 13,
          itemBuilder: (ctx, idx) {
            return Card(
              child: ListTile(
                title: Text('Titolo elemento $idx'),
                trailing: const Icon(Icons.arrow_right),
              ),
            );
          },
        ),
      ),
    );
  }
}

Enjoy!


Condividi

Commentami!