Flutter占位符骨架屏插件main_skeletons的使用

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

Flutter占位符骨架屏插件main_skeletons的使用

简介

main_skeletons 是一个用于在加载数据时显示占位符骨架屏的 Flutter 包。它可以帮助开发者轻松创建自定义的骨架屏小部件,从而提升用户体验。


示例代码

以下是一个完整的示例,展示如何使用 main_skeletons 插件来实现骨架屏效果。

// 导入必要的包
import 'package:flutter/material.dart';
import 'package:main_skeletons/main_skeletons.dart';

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

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

class SkeletonExamplePage extends StatefulWidget {
  @override
  _SkeletonExamplePageState createState() => _SkeletonExamplePageState();
}

class _SkeletonExamplePageState extends State<SkeletonExamplePage> {
  bool _isLoading = true;

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Skeletons Example'),
      ),
      body: Center(
        child: _isLoading
            ? Skeleton(
                isLoading: true,
                skeleton: SkeletonListView(),
                child: Container(
                  child: Center(
                    child: Text("Content"),
                  ),
                ),
              )
            : Text("Data Loaded!"),
      ),
    );
  }
}

骨架屏的更多定制化

除了基本用法,main_skeletons 还支持丰富的定制化选项。例如,可以通过 SkeletonTheme 设置全局的骨架屏样式。

// 使用 SkeletonTheme 自定义骨架屏主题
Scaffold(
  body: SkeletonTheme(
    shimmerGradient: LinearGradient(
      colors: [
        Color(0xFFD8E3E7),
        Color(0xFFC8D5DA),
        Color(0xFFD8E3E7),
      ],
      stops: [0.1, 0.5, 0.9],
    ),
    darkShimmerGradient: LinearGradient(
      colors: [
        Color(0xFF222222),
        Color(0xFF242424),
        Color(0xFF2B2B2B),
        Color(0xFF242424),
        Color(0xFF222222),
      ],
      stops: [0.0, 0.2, 0.5, 0.8, 1],
      begin: Alignment(-2.4, -0.2),
      end: Alignment(2.4, 0.2),
      tileMode: TileMode.clamp,
    ),
    child: Scaffold(
      body: Center(
        child: Text("Custom Skeleton Theme"),
      ),
    ),
  ),
)

更复杂的骨架屏示例

对于更复杂的内容布局(如卡片),可以使用 SkeletonItem 来构建自定义的骨架屏组件。

ListView.builder(
  physics: NeverScrollableScrollPhysics(),
  itemCount: 5,
  itemBuilder: (context, index) => Padding(
    padding: const EdgeInsets.all(8.0),
    child: Container(
      padding: const EdgeInsets.all(8.0),
      decoration: BoxDecoration(color: Colors.white),
      child: SkeletonItem(
        child: Column(
          children: [
            Row(
              children: [
                SkeletonAvatar(
                  style: SkeletonAvatarStyle(
                      shape: BoxShape.circle, width: 50, height: 50),
                ),
                SizedBox(width: 8),
                Expanded(
                  child: SkeletonParagraph(
                    style: SkeletonParagraphStyle(
                        lines: 3,
                        spacing: 6,
                        lineStyle: SkeletonLineStyle(
                          randomLength: true,
                          height: 10,
                          borderRadius: BorderRadius.circular(8),
                          minLength: MediaQuery.of(context).size.width / 6,
                          maxLength: MediaQuery.of(context).size.width / 3,
                        )),
                  ),
                )
              ],
            ),
            SizedBox(height: 12),
            SkeletonParagraph(
              style: SkeletonParagraphStyle(
                  lines: 3,
                  spacing: 6,
                  lineStyle: SkeletonLineStyle(
                    randomLength: true,
                    height: 10,
                    borderRadius: BorderRadius.circular(8),
                    minLength: MediaQuery.of(context).size.width / 2,
                  )),
            ),
            SizedBox(height: 12),
            SkeletonAvatar(
              style: SkeletonAvatarStyle(
                width: double.infinity,
                minHeight: MediaQuery.of(context).size.height / 8,
                maxHeight: MediaQuery.of(context).size.height / 3,
              ),
            ),
            SizedBox(height: 8),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                Row(
                  children: [
                    SkeletonAvatar(style: SkeletonAvatarStyle(width: 20, height: 20)),
                    SizedBox(width: 8),
                    SkeletonAvatar(style: SkeletonAvatarStyle(width: 20, height: 20)),
                    SizedBox(width: 8),
                    SkeletonAvatar(style: SkeletonAvatarStyle(width: 20, height: 20)),
                  ],
                ),
                SkeletonLine(
                  style: SkeletonLineStyle(
                      height: 16,
                      width: 64,
                      borderRadius: BorderRadius.circular(8)),
                )
              ],
            )
          ],
        ),
      ),
    ),
  ),
);

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

1 回复

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


main_skeletons 是一个用于 Flutter 应用的占位符骨架屏插件,它可以帮助你在数据加载时展示一个占位符骨架屏,提升用户体验。以下是如何使用 main_skeletons 插件的详细步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  main_skeletons: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 main_skeletons 插件:

import 'package:main_skeletons/main_skeletons.dart';

3. 使用骨架屏

main_skeletons 提供了多种预定义的骨架屏组件,你可以根据需要使用它们。

3.1 基本骨架屏

你可以使用 SkeletonContainer 来创建一个简单的骨架屏:

SkeletonContainer(
  width: 200,
  height: 100,
  borderRadius: BorderRadius.circular(8),
)

3.2 列表骨架屏

如果你需要在列表中展示骨架屏,可以使用 SkeletonList

SkeletonList(
  length: 5, // 列表项的数量
  builder: (context, index) => ListTile(
    leading: SkeletonContainer(
      width: 40,
      height: 40,
      borderRadius: BorderRadius.circular(20),
    ),
    title: SkeletonContainer(
      width: double.infinity,
      height: 16,
    ),
    subtitle: SkeletonContainer(
      width: double.infinity,
      height: 12,
    ),
  ),
)

3.3 网格骨架屏

对于网格布局,可以使用 SkeletonGrid

SkeletonGrid(
  crossAxisCount: 2, // 每行的列数
  itemCount: 6, // 网格项的数量
  builder: (context, index) => SkeletonContainer(
    width: double.infinity,
    height: 100,
    borderRadius: BorderRadius.circular(8),
  ),
)

4. 控制骨架屏的显示

通常,骨架屏会在数据加载时显示,数据加载完成后隐藏。你可以通过条件渲染来控制骨架屏的显示:

bool isLoading = true; // 假设这是你的加载状态

[@override](/user/override)
Widget build(BuildContext context) {
  return isLoading
      ? SkeletonList(
          length: 5,
          builder: (context, index) => ListTile(
            leading: SkeletonContainer(
              width: 40,
              height: 40,
              borderRadius: BorderRadius.circular(20),
            ),
            title: SkeletonContainer(
              width: double.infinity,
              height: 16,
            ),
            subtitle: SkeletonContainer(
              width: double.infinity,
              height: 12,
            ),
          ),
        )
      : ListView.builder(
          itemCount: 5,
          itemBuilder: (context, index) => ListTile(
            leading: CircleAvatar(
              child: Text('$index'),
            ),
            title: Text('Item $index'),
            subtitle: Text('Subtitle $index'),
          ),
        );
}

5. 自定义骨架屏

main_skeletons 允许你自定义骨架屏的样式。你可以通过 SkeletonContainercolorshimmerColor 属性来调整颜色:

SkeletonContainer(
  width: 200,
  height: 100,
  borderRadius: BorderRadius.circular(8),
  color: Colors.grey[300],
  shimmerColor: Colors.grey[100],
)

6. 动画效果

main_skeletons 默认提供了闪烁动画效果,你可以通过 shimmer 属性来控制是否启用动画:

SkeletonContainer(
  width: 200,
  height: 100,
  borderRadius: BorderRadius.circular(8),
  shimmer: false, // 禁用闪烁动画
)

7. 其他功能

main_skeletons 还提供了其他一些功能,如 SkeletonAvatarSkeletonText 等,你可以根据需要使用它们。

8. 示例代码

以下是一个完整的示例代码,展示了如何使用 main_skeletons 插件:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Skeleton Screen Example'),
        ),
        body: SkeletonExample(),
      ),
    );
  }
}

class SkeletonExample extends StatefulWidget {
  [@override](/user/override)
  _SkeletonExampleState createState() => _SkeletonExampleState();
}

class _SkeletonExampleState extends State<SkeletonExample> {
  bool isLoading = true;

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return isLoading
        ? SkeletonList(
            length: 5,
            builder: (context, index) => ListTile(
              leading: SkeletonContainer(
                width: 40,
                height: 40,
                borderRadius: BorderRadius.circular(20),
              ),
              title: SkeletonContainer(
                width: double.infinity,
                height: 16,
              ),
              subtitle: SkeletonContainer(
                width: double.infinity,
                height: 12,
              ),
            ),
          )
        : ListView.builder(
            itemCount: 5,
            itemBuilder: (context, index) => ListTile(
              leading: CircleAvatar(
                child: Text('$index'),
              ),
              title: Text('Item $index'),
              subtitle: Text('Subtitle $index'),
            ),
          );
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!