Flutter折叠面板插件accordion的使用

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

Flutter折叠面板插件accordion的使用

简介

accordion 是一个可扩展的Flutter小部件列表,每个项目都可以通过单击标题来展开或折叠。它简单易用,并提供了许多预设属性。你可以使用 maxOpenSections 属性来自动关闭其他部分,以确保每次只打开一个部分。这有助于保持列表的整洁外观。

主要特性

  • 简洁易用:提供多种预设属性。
  • 自动关闭功能:设置 maxOpenSections 参数为1时,每次打开新部分会自动关闭旧的部分。
  • 滚动可见性scrollIntoView 参数可以设置为 fast, slow, 或 none,确保新打开的项完全可见。
  • 全局和局部配置:大多数参数可以在 Accordion 中全局设置,也可以在每个 AccordionSection 中单独设置。
  • 自定义头部和内容:可以通过 headercontent 参数自定义头部和内容区域的小部件。
  • 嵌套支持:可以在 AccordionSection 内部嵌套另一个 Accordion

常见错误

避免将整个 Accordion 小部件包裹在状态管理中,因为这可能会导致每次状态变化时都播放展开动画。相反,应该仅包裹需要更新的内容部分,或者将 AccordionSection 的内容部分提取为一个独立的小部件,并在此处处理状态管理需求。

示例代码

下面是一个完整的示例,展示了如何使用 accordion 插件:

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

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

class AccordionApp extends StatelessWidget {
  const AccordionApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const AccordionPage(),
    );
  }
}

class AccordionPage extends StatelessWidget {
  static const headerStyle = TextStyle(
      color: Color(0xffffffff), fontSize: 18, fontWeight: FontWeight.bold);
  static const contentStyleHeader = TextStyle(
      color: Color(0xff999999), fontSize: 14, fontWeight: FontWeight.w700);
  static const contentStyle = TextStyle(
      color: Color(0xff999999), fontSize: 14, fontWeight: FontWeight.normal);
  static const loremIpsum =
      '''Lorem ipsum is typically a corrupted version of 'De finibus bonorum et malorum', a 1st century BC text by the Roman statesman and philosopher Cicero, with words altered, added, and removed to make it nonsensical and improper Latin.''';
  static const slogan =
      'Do not forget to play around with all sorts of colors, backgrounds, borders, etc.';

  const AccordionPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blueGrey[100],
      appBar: AppBar(
        title: const Text('Accordion'),
      ),
      body: Accordion(
        headerBorderColor: Colors.blueGrey,
        headerBorderColorOpened: Colors.transparent,
        headerBackgroundColorOpened: Colors.green,
        contentBackgroundColor: Colors.white,
        contentBorderColor: Colors.green,
        contentBorderWidth: 3,
        contentHorizontalPadding: 20,
        scaleWhenAnimating: true,
        openAndCloseAnimation: true,
        headerPadding:
            const EdgeInsets.symmetric(vertical: 7, horizontal: 15),
        sectionOpeningHapticFeedback: SectionHapticFeedback.heavy,
        sectionClosingHapticFeedback: SectionHapticFeedback.light,
        children: [
          AccordionSection(
            isOpen: true,
            contentVerticalPadding: 20,
            leftIcon: const Icon(Icons.text_fields_rounded, color: Colors.white),
            header: const Text('Simple Text', style: headerStyle),
            content: const Text(loremIpsum, style: contentStyle),
          ),
          AccordionSection(
            isOpen: true,
            leftIcon: const Icon(Icons.input, color: Colors.white),
            header: const Text('Text Field & Button', style: headerStyle),
            contentHorizontalPadding: 40,
            contentVerticalPadding: 20,
            content: const MyInputForm(),
          ),
          AccordionSection(
            isOpen: true,
            leftIcon: const Icon(Icons.child_care_rounded, color: Colors.white),
            header: const Text('Nested Accordion', style: headerStyle),
            content: const MyNestedAccordion(),
          ),
          AccordionSection(
            isOpen: false,
            leftIcon: const Icon(Icons.shopping_cart, color: Colors.white),
            header: const Text('DataTable', style: headerStyle),
            content: const MyDataTable(),
          ),
          // More AccordionSection examples...
        ],
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextFormField(
          decoration: InputDecoration(
            label: const Text('Some text goes here ...'),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(10),
            ),
          ),
        ).marginOnly(bottom: 10),
        ElevatedButton(
          onPressed: () {},
          child: const Text('Submit'),
        )
      ],
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return DataTable(
      sortAscending: true,
      sortColumnIndex: 1,
      showBottomBorder: false,
      columns: const [
        DataColumn(
            label: Text('ID', style: AccordionPage.contentStyleHeader),
            numeric: true),
        DataColumn(
            label: Text('Description', style: AccordionPage.contentStyleHeader)),
        DataColumn(
            label: Text('Price', style: AccordionPage.contentStyleHeader),
            numeric: true),
      ],
      rows: const [
        DataRow(
          cells: [
            DataCell(Text('1',
                style: AccordionPage.contentStyle, textAlign: TextAlign.right)),
            DataCell(Text('Fancy Product', style: AccordionPage.contentStyle)),
            DataCell(Text(r'$ 199.99',
                style: AccordionPage.contentStyle, textAlign: TextAlign.right))
          ],
        ),
        // More DataRow examples...
      ],
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Accordion(
      paddingListTop: 0,
      paddingListBottom: 0,
      maxOpenSections: 1,
      headerBackgroundColorOpened: Colors.black54,
      headerPadding: const EdgeInsets.symmetric(vertical: 7, horizontal: 15),
      children: [
        AccordionSection(
          isOpen: true,
          leftIcon: const Icon(Icons.insights_rounded, color: Colors.white),
          headerBackgroundColor: Colors.black38,
          headerBackgroundColorOpened: Colors.black54,
          header: const Text('Nested Section #1', style: AccordionPage.headerStyle),
          content: const Text(AccordionPage.loremIpsum, style: AccordionPage.contentStyle),
          contentHorizontalPadding: 20,
          contentBorderColor: Colors.black54,
        ),
        AccordionSection(
          isOpen: true,
          leftIcon: const Icon(Icons.compare_rounded, color: Colors.white),
          header: const Text('Nested Section #2', style: AccordionPage.headerStyle),
          headerBackgroundColor: Colors.black38,
          headerBackgroundColorOpened: Colors.black54,
          contentBorderColor: Colors.black54,
          content: const Row(
            children: [
              Icon(Icons.compare_rounded, size: 120, color: Colors.orangeAccent),
              Flexible(
                  flex: 1,
                  child: Text(AccordionPage.loremIpsum, style: AccordionPage.contentStyle)),
            ],
          ),
        ),
      ],
    );
  }
}

关键点解释

  • Accordion:主控件,包含多个 AccordionSection,可以设置全局属性如 maxOpenSectionsheaderBackgroundColor 等。
  • AccordionSection:每个可折叠部分,可以设置是否初始展开、头部和内容区域的样式等。
  • 嵌套:可以在 AccordionSection 中嵌套另一个 Accordion,实现多级折叠效果。

通过这个示例,你可以看到如何创建一个带有不同样式的折叠面板,并且可以根据需要进行进一步的自定义。希望这些信息对你有所帮助!


更多关于Flutter折叠面板插件accordion的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter折叠面板插件accordion的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用accordion插件来创建折叠面板的示例代码。accordion插件允许你创建可折叠的内容区域,这在需要显示或隐藏大量信息时非常有用。

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

dependencies:
  flutter:
    sdk: flutter
  accordion: ^1.0.0  # 请检查最新版本号

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

接下来,你可以在你的Flutter应用中使用Accordion组件。以下是一个完整的示例代码,展示了如何使用Accordion来创建折叠面板:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Accordion Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Accordion Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: AccordionList(
            headers: List.generate(
              5,
              (index) => ListTile(
                title: Text('Header ${index + 1}'),
              ),
            ),
            contents: List.generate(
              5,
              (index) => Padding(
                padding: const EdgeInsets.symmetric(vertical: 8.0),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Text('Content for header ${index + 1}, line 1'),
                    Text('Content for header ${index + 1}, line 2'),
                    Text('Content for header ${index + 1}, line 3'),
                  ],
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个AccordionListAccordionList接受两个参数:headerscontents

  • headers是一个ListTile的列表,每个ListTile代表一个可折叠面板的标题。
  • contents是与标题相对应的内容的列表,当点击相应的标题时,这些内容会展开或折叠。

List.generate方法用于生成5个标题和内容项作为示例。你可以根据需要调整生成的数量和内容。

运行这个应用,你会看到一个包含5个折叠面板的列表。点击每个面板的标题,你会看到相应的内容展开或折叠。

希望这个示例能帮助你理解如何在Flutter中使用accordion插件来创建折叠面板。如果你有任何其他问题,欢迎继续提问!

回到顶部