Flutter可扩展页面视图插件expandable_page_view的使用

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

Flutter可扩展页面视图插件expandable_page_view的使用

expandable_page_view是一个能够根据当前显示页面调整高度的PageView小部件。它接受与经典PageView相同的参数。

示例效果

Horizontal Vertical
Horizontal Vertical

开始使用

在Flutter项目的pubspec.yaml文件中添加以下依赖项:

dependencies:
  ...
  expandable_page_view: ^1.0.17

然后导入包:

import 'package:expandable_page_view/expandable_page_view.dart';

使用示例

固定Expandable Page View

要创建一个固定页面视图,只需将一组小部件传递给children参数:

ExpandablePageView(
  children: [
     ExamplePage(Colors.blue, "1", 100),
     ExamplePage(Colors.green, "2", 200),
     ExamplePage(Colors.red, "3", 300),
  ],
),

其中ExamplePage可以自定义为如下:

class ExamplePage extends StatelessWidget {
  final Color color;
  final String text;
  final double height;

  ExamplePage(this.color, this.text, this.height);

  @override
  Widget build(BuildContext context) {
    return Container(
      color: color,
      height: height,
      child: Center(
        child: Text(text, style: TextStyle(fontSize: 24, color: Colors.white)),
      ),
    );
  }
}

动态构建的Expandable Page View

如果您有多个页面需要显示,并且希望在滚动时动态构建它们,请使用.builder构造函数并传递itemCountitemBuilder参数:

ExpandablePageView.builder(
  itemCount: 3,
  itemBuilder: (context, index) {
    return ExamplePage(Colors.blue, index.toString(), (index + 1) * 100.0);
  },
),

完整的示例demo

下面提供了一个完整的示例代码,演示了如何使用expandable_page_view插件创建一个简单的应用程序,该应用程序包含三个页面,每个页面有不同的颜色和高度,并且可以通过底部导航栏进行切换。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Expandable Page View Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Expandable Page View Demo'),
    );
  }
}

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

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _currentIndex = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: IndexedStack(
        index: _currentIndex,
        children: [
          BalancePage(),
          VerticalBalancePage(),
          BasicExamplesPage(),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        backgroundColor: Colors.blue,
        currentIndex: _currentIndex,
        unselectedItemColor: Color(0xff3a0ca3),
        selectedItemColor: Colors.white,
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.attach_money_rounded),
            label: '',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.currency_exchange_rounded),
            label: '',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.info),
            label: '',
          ),
        ],
        onTap: (index) => setState(() => _currentIndex = index),
      ),
    );
  }
}

// 自定义页面组件
class BalancePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ExpandablePageView(
      children: [
        ExamplePage(Colors.blue, "1", 100),
        ExamplePage(Colors.green, "2", 200),
        ExamplePage(Colors.red, "3", 300),
      ],
    );
  }
}

class VerticalBalancePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ExpandablePageView.builder(
      scrollDirection: Axis.vertical,
      itemCount: 3,
      itemBuilder: (context, index) {
        return ExamplePage(Colors.blue, index.toString(), (index + 1) * 100.0);
      },
    );
  }
}

class BasicExamplesPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Basic Examples Page', style: TextStyle(fontSize: 24)),
    );
  }
}

class ExamplePage extends StatelessWidget {
  final Color color;
  final String text;
  final double height;

  ExamplePage(this.color, this.text, this.height);

  @override
  Widget build(BuildContext context) {
    return Container(
      color: color,
      height: height,
      child: Center(
        child: Text(text, style: TextStyle(fontSize: 24, color: Colors.white)),
      ),
    );
  }
}

这个例子展示了如何使用expandable_page_view来创建一个具有不同布局和内容的页面视图,并通过底部导航栏在这些页面之间切换。您还可以根据需要调整和扩展此代码以适应您的应用需求。


更多关于Flutter可扩展页面视图插件expandable_page_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter可扩展页面视图插件expandable_page_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用expandable_page_view插件的示例代码。expandable_page_view插件允许你创建一个可扩展的页面视图,类似于某些应用中的可折叠面板。

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

dependencies:
  flutter:
    sdk: flutter
  expandable_page_view: ^最新版本号  # 请替换为实际发布的最新版本号

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

接下来,我们编写一个示例页面来展示如何使用expandable_page_view

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Expandable Page View Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ExpandablePageViewDemo(),
    );
  }
}

class ExpandablePageViewDemo extends StatefulWidget {
  @override
  _ExpandablePageViewDemoState createState() => _ExpandablePageViewDemoState();
}

class _ExpandablePageViewDemoState extends State<ExpandablePageViewDemo> {
  final List<String> titles = ['Page 1', 'Page 2', 'Page 3'];
  final List<Widget> pages = [
    Center(child: Text('This is Page 1')),
    Center(child: Text('This is Page 2')),
    Center(child: Text('This is Page 3')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Expandable Page View Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: ExpandablePageView.builder(
          itemCount: titles.length,
          itemBuilder: (context, index) {
            return ExpandablePage(
              header: Container(
                decoration: BoxDecoration(
                  color: Colors.grey[200],
                  borderRadius: BorderRadius.circular(8.0),
                ),
                padding: const EdgeInsets.all(16.0),
                child: Text(titles[index], style: TextStyle(fontSize: 20)),
              ),
              content: pages[index],
              expanded: index == 1,  // 默认展开第二个页面
              onToggle: (expanded) {
                // 可以在这里处理展开或折叠的回调
                print('Page ${index + 1} is now ${expanded ? 'expanded' : 'collapsed'}');
              },
            );
          },
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个ExpandablePageView.builder,它使用builder函数来构建每个页面。每个页面都是一个ExpandablePage,它包含一个头部(header)和一个内容(content)。我们还设置了expanded属性来指定哪些页面默认是展开的,并通过onToggle回调来处理展开或折叠事件。

请确保你安装了最新版本的expandable_page_view插件,并检查其文档以获取最新的API和使用方法,因为插件的API可能会随着版本更新而发生变化。

回到顶部