Flutter Cupertino风格堆叠视图插件cupertino_stackview的使用

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

Flutter Cupertino风格堆叠视图插件cupertino_stackview的使用

cupertino_stackview 是一个非常易于使用的导航工具/小部件,用于实现 iOS 13 风格的堆栈。以下是如何在 Flutter 应用中使用这个插件的详细步骤和示例代码。

插件介绍

cupertino_stackview 提供了一种类似于 iOS 13 的堆栈导航系统,可以让你轻松地在应用中实现这种风格的页面切换效果。

安装

在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  cupertino_stackview: ^latest_version

然后运行 flutter pub get 来安装插件。

使用步骤

1. 初始化 CupertinoStackViewController

首先需要实例化 CupertinoStackViewController,并传递必要的参数:

import 'package:cupertino_stackview/cupertino_stackview.dart';

GlobalKey<NavigatorState> navigatorState = GlobalKey<NavigatorState>();

CupertinoStackViewController cupertinoStackViewController;

void main() {
  cupertinoStackViewController = CupertinoStackViewController(
    navigatorState,
    {
      "Page I": (BuildContext context, dynamic parameters) {
        return PageI();
      },
      "Page II": (BuildContext context, dynamic parameters) {
        return PageII();
      },
      "Page III": (BuildContext context, dynamic parameters) {
        return PageIII();
      },
      "Page IV": (BuildContext context, dynamic parameters) {
        return PageIV();
      },
    },
  );
  runApp(MyApp());
}

2. 创建 CupertinoStackView 小部件

在你的主页面或任何需要的地方创建 CupertinoStackView 小部件:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Cupertino Stack View Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: MyPage(0),
      navigatorKey: navigatorState,
    );
  }
}

class MyPage extends StatefulWidget {
  final int index;

  MyPage(this.index, {Key? key}) : super(key: key);

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

class _MyPageState extends State<MyPage> {
  @override
  Widget build(BuildContext context) {
    cupertinoStackViewController.initialise(MediaQuery.of(context).size.height, MediaQuery.of(context).size.width);
    return CupertinoStackView(
      widget.index == 0,
      pageInfos[widget.index].navigation,
      Scaffold(
        backgroundColor: const Color(0xFFF2F2F7),
        appBar: AppBar(
          backgroundColor: const Color(0xFFF9F9F9),
          leading: widget.index == 0
              ? null
              : IconButton(
                  icon: Icon(Icons.chevron_left, color: Colors.black),
                  onPressed: () {
                    cupertinoStackViewController.back();
                  },
                ),
          title: Text(
            pageInfos[widget.index].navigation,
            style: const TextStyle(color: Colors.black, fontSize: 32, fontWeight: FontWeight.bold),
          ),
        ),
        body: SingleChildScrollView(
          child: Column(
            children: [
              // 页面内容
              if (widget.index != pageInfos.length - 1)
                Align(
                  alignment: Alignment(0.0, 0.5),
                  child: Padding(
                    padding: const EdgeInsets.all(32),
                    child: ElevatedButton(
                      onPressed: () {
                        cupertinoStackViewController.navigate(pageInfos[widget.index + 1].navigation, context, null);
                      },
                      child: Text("Open Stack"),
                    ),
                  ),
                ),
              if (widget.index == pageInfos.length - 1)
                Align(
                  alignment: Alignment(0.0, 0.5),
                  child: Padding(
                    padding: const EdgeInsets.all(32),
                    child: ElevatedButton(
                      onPressed: () {
                        cupertinoStackViewController.navigate(pageInfos[0].navigation, context, null);
                      },
                      child: Text("Go to Home"),
                    ),
                  ),
                ),
            ],
          ),
        ),
      ),
      Colors.black,
      isDismissible: widget.index != pageInfos.length - 1,
    );
  }
}

示例数据模型

为了演示目的,我们定义了一个简单的数据模型 PageInfo

class PageInfo {
  final String navigation;
  final String title;
  final String text;

  PageInfo(this.navigation, this.title, this.text);
}

List<PageInfo> pageInfos = [
  PageInfo(
    "Stack I",
    "Lorem Ipsum Dolor",
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit...",
  ),
  PageInfo(
    "Stack II",
    "Sed ut Perspiciatis",
    "Sed ut perspiciatis unde omnis iste natus error sit voluptatem...",
  ),
  PageInfo(
    "Stack III",
    "Adipisci Velit",
    "Sed quia consequuntur magni dolores eos qui ratione voluptatem...",
  ),
  PageInfo(
    "Stack IV",
    "Ut Enim ad Minima",
    "Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis...",
  ),
];

更多关于Flutter Cupertino风格堆叠视图插件cupertino_stackview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Cupertino风格堆叠视图插件cupertino_stackview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用cupertino_stackview插件来创建一个具有Cupertino风格的堆叠视图的示例代码。请注意,cupertino_stackview可能不是Flutter官方提供的标准组件,因此这里假设你已经通过pubspec.yaml文件添加了该插件的依赖。

首先,确保在你的pubspec.yaml文件中添加cupertino_stackview依赖(如果它存在的话;如果这是一个假设的插件,你可能需要找到一个类似的或者自定义实现):

dependencies:
  flutter:
    sdk: flutter
  cupertino_stackview: ^x.y.z  # 替换为实际版本号

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

接下来,在你的Dart文件中使用CupertinoStackView(这里假设插件提供了一个名为CupertinoStackView的组件):

import 'package:flutter/material.dart';
import 'package:cupertino_stackview/cupertino_stackview.dart';  // 假设的包路径

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

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

class CupertinoStackViewDemo extends StatefulWidget {
  @override
  _CupertinoStackViewDemoState createState() => _CupertinoStackViewDemoState();
}

class _CupertinoStackViewDemoState extends State<CupertinoStackViewDemo> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cupertino StackView Demo'),
      ),
      body: CupertinoStackView(
        alignment: Alignment.center,
        children: <Widget>[
          // 底层视图
          Container(
            width: double.infinity,
            height: double.infinity,
            color: CupertinoColors.systemBackground,
            child: Center(
              child: Text(
                'Bottom Layer',
                style: TextStyle(color: CupertinoColors.black),
              ),
            ),
          ),
          // 中间层视图,带半透明背景
          Container(
            width: double.infinity,
            height: double.infinity,
            color: CupertinoColors.inactiveGray.withOpacity(0.5),
            child: Center(
              child: Text(
                'Middle Layer',
                style: TextStyle(color: CupertinoColors.white),
              ),
            ),
          ),
          // 顶层视图
          Container(
            width: 200,
            height: 200,
            decoration: BoxDecoration(
              color: CupertinoColors.activeBlue,
              borderRadius: BorderRadius.circular(16),
            ),
            child: Center(
              child: Text(
                'Top Layer',
                style: TextStyle(color: CupertinoColors.white),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们创建了一个CupertinoStackView,其中包含了三个堆叠的子视图:

  1. 底层视图:一个填充整个屏幕的Container,背景色为系统背景色,并显示文本“Bottom Layer”。
  2. 中间层视图:一个半透明的灰色Container,覆盖在底层视图之上,并显示文本“Middle Layer”。
  3. 顶层视图:一个带有圆角边框和蓝色背景的Container,显示文本“Top Layer”。

请注意,CupertinoStackView的具体实现和API可能会根据插件的实际版本有所不同。如果cupertino_stackview插件不存在或者API有所不同,你可能需要参考该插件的文档或者实现一个类似的自定义组件。

此外,Flutter本身提供了Stack组件,可以用于创建堆叠视图,而不需要额外的插件。如果你只是想要一个堆叠视图而不需要特定的Cupertino风格,可以考虑使用Stack组件。

回到顶部