Flutter UI组件库插件flutter_vant的使用

flutter_vant 是一个基于 Flutter 的 UI 组件库插件,它提供了丰富的组件,帮助开发者快速构建美观且功能强大的移动应用界面。本文将通过一个完整的示例代码展示如何使用 flutter_vant 插件来创建一个简单的应用。

安装 flutter_vant

在使用 flutter_vant 之前,首先需要将其添加到项目的依赖中。在 pubspec.yaml 文件中添加以下内容:

dependencies:
  flutter_vant: ^1.0.0

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

示例代码

以下是一个完整的示例代码,展示了如何使用 flutter_vant 插件来创建一个包含多个组件的简单应用。

import 'package:flutter/material.dart';
import 'package:flutter_vant/main.dart'; // 导入 flutter_vant 主包

// 导入各个组件的示例页面
import './view/button.dart';
import './view/cell.dart';
import './view/icon.dart';
import './view/image.dart';
import './view/loading.dart';

void main() {
  runApp(const App()); // 启动应用
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Home(), // 设置主页为 Home 页面
      // home: ImageDemo(), // 可以直接跳转到某个组件示例
    );
  }
}

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  [@override](/user/override)
  HomeState createState() => HomeState(); // 创建状态类
}

class HomeState extends State<Home> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        alignment: Alignment.topLeft, // 对齐方式
        color: VanColor.white, // 背景颜色
        padding: const EdgeInsets.only(
          top: 30,
          right: 15,
          bottom: 30,
          left: 15,
        ),
        child: SingleChildScrollView( // 使用单ChildScrollView允许滚动
          child: _menu(), // 渲染菜单
        ),
      ),
    );
  }

  // 渲染菜单项
  Widget _menu() {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start, // 左对齐
      children: [
        _title('基础组件'), // 分组标题
        _cellBtn('Button 按钮', () { _router('button'); }), // 按钮示例
        _cellBtn('Cell 单元格', () { _router('cell'); }), // 单元格示例
        _cellBtn('Icon 图标', () { _router('icon'); }), // 图标示例
        _cellBtn('Image 图片', () { _router('image'); }), // 图片示例
        _title('反馈组件'), // 反馈组件分组标题
        _cellBtn('Loading 加载', () { _router('loading'); }), // 加载动画示例
      ],
    );
  }

  // 渲染按钮
  Widget _cellBtn(String text, onPressed) {
    return Padding(
      padding: const EdgeInsets.only(top: 10), // 上方间距
      child: VanButton(
        mainAxisAlignment: MainAxisAlignment.start, // 按钮左对齐
        backgroundColor: VanColor.gray1, // 按钮背景色
        fontColor: VanColor.black, // 字体颜色
        round: true, // 圆角按钮
        text: text, // 按钮文本
        width: double.infinity, // 按钮宽度占满父容器
        onPressed: onPressed, // 点击事件
      ),
    );
  }

  // 渲染标题
  Widget _title(text) {
    return Container(
      padding: const EdgeInsets.only(
        top: 15,
        left: 20, // 左侧内边距
      ),
      child: Text(
        text, // 标题文本
        style: const TextStyle(
          fontSize: 14, // 字体大小
          color: VanColor.gray6, // 文字颜色
        ),
      ),
    );
  }

  // 路由跳转方法
  _router(String path) {
    var map = {
      'button': const ButtonDemo(), // 按钮示例页面
      'cell': const CellDemo(), // 单元格示例页面
      'icon': const IconDemo(), // 图标示例页面
      'image': const ImageDemo(), // 图片示例页面
      'loading': const LoadingDemo(), // 加载动画示例页面
    };
    var wdt = map[path] ?? Container(); // 默认返回空容器
    Navigator.push(
      context,
      MaterialPageRoute(
        builder: (context) => wdt, // 构建目标页面
      ),
    );
  }
}

更多关于Flutter UI组件库插件flutter_vant的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter UI组件库插件flutter_vant的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_vant 是一个基于 Flutter 的 UI 组件库,灵感来源于 Vant(一个轻量级的移动端 Vue 组件库)。它提供了丰富的组件,帮助开发者快速构建美观且功能完善的移动应用界面。

安装 flutter_vant

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

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

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

使用 flutter_vant 组件

flutter_vant 提供了多种常用的 UI 组件,如按钮、表单、对话框、标签栏等。以下是一些常见组件的使用示例。

1. 按钮 (Button)

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

class ButtonExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Button Example")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            VanButton(
              text: "Primary Button",
              type: ButtonType.primary,
              onPressed: () {
                print("Primary Button Pressed");
              },
            ),
            SizedBox(height: 20),
            VanButton(
              text: "Danger Button",
              type: ButtonType.danger,
              onPressed: () {
                print("Danger Button Pressed");
              },
            ),
          ],
        ),
      ),
    );
  }
}

2. 表单 (Form)

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

class FormExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Form Example")),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: VanForm(
          child: Column(
            children: [
              VanField(
                label: "Username",
                placeholder: "Enter your username",
              ),
              VanField(
                label: "Password",
                placeholder: "Enter your password",
                obscureText: true,
              ),
              SizedBox(height: 20),
              VanButton(
                text: "Submit",
                type: ButtonType.primary,
                onPressed: () {
                  print("Form Submitted");
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

3. 对话框 (Dialog)

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

class DialogExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Dialog Example")),
      body: Center(
        child: VanButton(
          text: "Show Dialog",
          type: ButtonType.primary,
          onPressed: () {
            VanDialog.show(
              context,
              title: "提示",
              message: "这是一个对话框示例",
              showCancelButton: true,
              onConfirm: () {
                print("Confirmed");
              },
              onCancel: () {
                print("Cancelled");
              },
            );
          },
        ),
      ),
    );
  }
}

4. 标签栏 (TabBar)

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

class TabBarExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("TabBar Example")),
      body: VanTabBar(
        items: [
          VanTabBarItem(text: "Tab 1"),
          VanTabBarItem(text: "Tab 2"),
          VanTabBarItem(text: "Tab 3"),
        ],
        onTap: (index) {
          print("Tab $index tapped");
        },
      ),
    );
  }
}

自定义主题

flutter_vant 允许你自定义主题颜色,以适应你的应用设计风格。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Vant Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Home Page")),
      body: Center(
        child: VanButton(
          text: "Custom Theme Button",
          type: ButtonType.primary,
          onPressed: () {
            print("Custom Theme Button Pressed");
          },
        ),
      ),
    );
  }
}
回到顶部