Flutter展开动画插件expand的使用

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

Flutter展开动画插件expand的使用

GitHub stars Package: expand Language: Dart License: MIT

expand 是一个用于帮助创建流畅、快速且简单的展开小部件的 Flutter 插件,使用最少的代码即可实现。

演示GIF

安装

要使用此插件,请在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  expand: ^最新版本号

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

开始使用

将任何可展开的小部件列表包裹在 ExpandableProvider 中即可开始使用。

使用方法

这是一个使用 ExpandableTile 的基本示例:

ExpandableProvider(
  child: ListView(
    children: [
      ExpandableTile(
        title: const Text('Tile 1'),
        detailsBuilder: (context) => Container(height: 200),
      ),
      ExpandableTile(
        title: const Text('Tile 2'),
        detailsBuilder: (context) => Container(height: 200),
      ),
    ],
  ),
)

可以跳过 ExpandableProvider 的使用,通过手动提供 ExpandableController 来实现。

关键组件

  • ExpandableProvider + ExpandableController: 展开卡片的状态提供者
  • ExpandableCard: 所有可展开小部件的基础
  • ExpandableTile: 带有可展开详情的 ListTile

完整示例

以下是完整的示例代码:

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(title: const Text('展开小部件示例')),
        body: ExpandableProvider(
          child: ListView(
            children: [
              // 第一个展开项
              ExpandableTile(
                title: const Text('Tile 1'),
                detailsBuilder: (context) =>
                    Container(height: 200, color: Colors.red),
              ),
              // 第二个展开项
              ExpandableTile(
                title: const Text('Tile 2'),
                detailsBuilder: (context) =>
                    Container(height: 200, color: Colors.green),
              ),
              // 第三个展开项
              ExpandableTile(
                id: 'tile3',
                title: const Text('Tile 3'),
                trailing: const Icon(Icons.arrow_drop_down),
                detailsBuilder: (context) =>
                    Container(height: 200, color: Colors.blue),
              ),
              // 自定义展开卡片
              ExpandableCard(
                childBuilder: (context, _) => AspectRatio(
                  aspectRatio: 2,
                  child: Ink.image(
                    image: const NetworkImage('https://picsum.photos/400/200'),
                    fit: BoxFit.cover,
                  ),
                ),
                detailsBuilder: (context) => Column(
                  children: [
                    Container(height: 200, color: Colors.pink),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: FilledButton(
                        onPressed: () {
                          ExpandableProvider.of(context).open('tile3');
                        },
                        child: const Text('打开 Tile 3'),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter展开动画插件expand的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter展开动画插件expand的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用expand插件来实现展开动画的示例代码。这个插件允许你创建一个可以展开和折叠的视图,并带有平滑的动画效果。

首先,确保你已经在pubspec.yaml文件中添加了expand依赖:

dependencies:
  flutter:
    sdk: flutter
  expandable: ^2.0.0  # 请注意,这里使用的可能是名为 'expandable' 或类似的插件,因为 'expand' 可能不是一个确切的插件名。如果找不到,请搜索类似的插件。

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

接下来是一个完整的示例代码,展示了如何使用这个插件来实现展开动画:

import 'package:flutter/material.dart';
import 'package:expandable/expandable.dart'; // 假设插件名为 'expandable',实际使用时请替换为正确的插件名

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Expand Animation Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: ExpandableTheme(
            data: ExpandableThemeData(
              tapBodyToCollapse: true,
              headerAlignment: MainAxisAlignment.start,
              iconColor: Colors.blue,
            ),
            child: ExpandableWidget(
              header: Container(
                decoration: BoxDecoration(
                  color: Colors.grey[200],
                  borderRadius: BorderRadius.circular(8.0),
                ),
                padding: const EdgeInsets.all(12.0),
                child: Text(
                  'Click to Expand',
                  style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                ),
              ),
              expanded: Container(
                decoration: BoxDecoration(
                  color: Colors.grey[100],
                  borderRadius: BorderRadius.circular(8.0),
                ),
                padding: const EdgeInsets.all(12.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text('This is the first line of expanded content.'),
                    Text('This is the second line of expanded content.'),
                    Text('This is the third line of expanded content.'),
                  ],
                ),
              ),
              collapsed: Container(
                height: 0, // Collapsed state can have zero height or any other desired height
              ),
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们使用了ExpandableWidget,它是一个可以展开和折叠的组件。header属性是展开前的头部内容,expanded属性是展开后的内容,而collapsed属性是折叠后的内容(通常高度为零)。

请注意,实际中expand插件的具体名称和使用方法可能会有所不同,这里假设了一个名为expandable的插件。如果找不到expand或类似的插件,请搜索Flutter的pub.dev网站以找到合适的插件。

希望这个示例代码对你有所帮助!

回到顶部