Flutter占位符展示插件better_skeleton的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter占位符展示插件better_skeleton的使用

Glass effect - for your skeleton loading

显示一个玻璃效果,使用单个AnimationController控制多个Widgets的加载动画。

Apparence.io better skeleton plugin gif

Developed with 💙  by Apparence.io

Tldr - features?

  • 使用单个AnimationController在多个Widgets上显示玻璃效果

Getting Started

创建一个重复模式的动画控制器,然后将此控制器提供给每个AnimatedSkeleton。这个效果是通过自定义的RenderWidget实现的。

示例代码

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
  late final AnimationController animationController;

  @override
  void initState() {
    super.initState();
    // 创建一个重复模式的动画控制器
    animationController = AnimationController(vsync: this, duration: Duration(milliseconds: 1000))..repeat();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            SizedBox(height: 100),
            AnimatedSkeleton(
              listenable: animationController,
              child: FakeCard(),
            ),
            AnimatedSkeleton(
              listenable: animationController,
              child: FakeCard(),
            ),
            AnimatedSkeleton(
              listenable: animationController,
              child: FakeCard2(),
            ),
          ],
        ),
      ),
    );
  }
}

// 模拟卡片组件
class FakeCard extends StatelessWidget {
  const FakeCard({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Container(
        width: double.infinity,
        color: Colors.grey[300],
        child: Padding(
          padding: EdgeInsets.all(16),
          child: Row(
            children: [
              Container(
                height: 40,
                width: 40,
                decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  color: Colors.grey[400],
                ),
              ),
              SizedBox(width: 20),
              Expanded(
                child: Container(
                  height: 40,
                  decoration: BoxDecoration(color: Colors.grey[400], borderRadius: BorderRadius.circular(5)),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 另一种模拟卡片组件
class FakeCard2 extends StatelessWidget {
  const FakeCard2({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Container(
        width: double.infinity,
        color: Colors.grey[300],
        child: Padding(
          padding: EdgeInsets.all(16),
          child: Row(
            children: [
              Container(
                height: 80,
                width: 80,
                decoration: BoxDecoration(
                  shape: BoxShape.circle,
                  color: Colors.grey[400],
                ),
              ),
              SizedBox(width: 20),
              Expanded(
                child: Column(
                  children: [
                    Container(
                      height: 40,
                      decoration: BoxDecoration(color: Colors.grey[400], borderRadius: BorderRadius.circular(5)),
                    ),
                    SizedBox(height: 16),
                    Container(
                      height: 40,
                      decoration: BoxDecoration(color: Colors.grey[400], borderRadius: BorderRadius.circular(5)),
                    )
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个带有重复模式动画控制器的应用程序,并将其应用于三个AnimatedSkeleton组件。每个AnimatedSkeleton包含一个模拟卡片组件(FakeCardFakeCard2),这些卡片展示了不同的布局和样式,以模拟实际内容的加载过程。


更多关于Flutter占位符展示插件better_skeleton的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter占位符展示插件better_skeleton的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用better_skeleton插件来展示占位符的示例代码。better_skeleton插件常用于在数据加载时显示占位符动画,提升用户体验。

首先,你需要在你的pubspec.yaml文件中添加better_skeleton依赖:

dependencies:
  flutter:
    sdk: flutter
  better_skeleton: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用better_skeleton插件。以下是一个完整的示例,展示如何在一个简单的页面中使用占位符:

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

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

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

class SkeletonScreen extends StatefulWidget {
  @override
  _SkeletonScreenState createState() => _SkeletonScreenState();
}

class _SkeletonScreenState extends State<SkeletonScreen> with SingleTickerProviderStateMixin {
  bool isLoading = true;

  @override
  void initState() {
    super.initState();
    // 模拟数据加载过程
    Future.delayed(Duration(seconds: 2), () {
      setState(() {
        isLoading = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Skeleton Loader Example'),
      ),
      body: isLoading
          ? Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                BetterSkeleton(
                  isLine: true,
                  count: 1,
                  width: MediaQuery.of(context).size.width * 0.8,
                  height: 24,
                ),
                SizedBox(height: 16),
                BetterSkeleton(
                  isLine: false,
                  count: 1,
                  width: MediaQuery.of(context).size.width * 0.6,
                  height: 160,
                  borderRadius: BorderRadius.circular(8),
                ),
                SizedBox(height: 16),
                BetterSkeleton(
                  isLine: true,
                  count: 1,
                  width: MediaQuery.of(context).size.width * 0.4,
                  height: 24,
                ),
              ],
            )
          : Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'Title',
                  style: TextStyle(fontSize: 24),
                ),
                SizedBox(height: 16),
                Image.network(
                  'https://via.placeholder.com/300',
                  width: MediaQuery.of(context).size.width * 0.6,
                  height: 160,
                  fit: BoxFit.cover,
                ),
                SizedBox(height: 16),
                Text(
                  'Some description text here.',
                  style: TextStyle(fontSize: 16),
                ),
              ],
            ),
    );
  }
}

在这个示例中,SkeletonScreen组件使用isLoading状态来管理数据的加载过程。当isLoadingtrue时,显示占位符;当isLoadingfalse时,显示实际的内容。

  • BetterSkeleton组件的isLine属性用于指定占位符是否为线条形式。
  • count属性指定占位符的数量。
  • widthheight属性用于指定占位符的宽度和高度。
  • borderRadius属性用于指定占位符的圆角半径。

通过这种方式,你可以在Flutter应用中优雅地展示占位符,直到数据加载完成。

回到顶部