Flutter自定义磁贴布局插件wx_tile的使用

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

Flutter自定义磁贴布局插件wx_tile的使用

插件介绍

wx_tile 是一个高度可定制的插件,扩展了 Flutter 的 ListTile 的功能。它提供了多种自定义选项,如间距、标题、子标题、图标等。

示例代码

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'WxTile Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return WxListTileTheme.merge(
      wrapper: WxListTileWrapper.inkWell(
        borderRadius: BorderRadius.circular(5),
      ),
      child: Wrapper(
        children: [
          const SizedBox(height: 40),
          WxText.displayMedium(
            'WxTile',
            gradient: LinearGradient(
              colors: [Colors.green, Colors.blue],
              begin: Alignment.topLeft,
              end: Alignment.bottomRight,
            ),
            fontWeight: FontWeight.bold,
            letterSpacing: -22,
          ),
          const SizedBox(height: 11),
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              WxTile(
                spacing: 10,
                leading: Text('Leading'),
                trailing: Text('Trailing'),
                child: Text('Horizontal Tile'),
              ),
              WxTile(
                spacing: 3,
                direction: Axis.vertical,
                leading: Text('Leading'),
                trailing: Text('Trailing'),
                child: Text('Vertical Tile'),
              ),
            ],
          ),
          WxTextTile(
            title: Text('Title'),
            subtitle: Text('Subtitle'),
            spacing: 5,
            align: TextAlign.right,
          ),
          WxListTile(
            title: const Text('title'),
            subtitle: const Text('subtitle'),
            leading: const Icon(Icons.access_time),
            trailing: IconButton(
              icon: const Icon(Icons.close),
              onPressed: () {},
            ),
            textColor: Colors.blue,
            iconColor: Colors.amber,
            onTap: () {},
          ),
          WxListTile(
            title: const Text('title'),
            subtitle: const Text('subtitle'),
            leading: const Icon(Icons.access_time),
            trailing: IconButton(
              icon: const Icon(Icons.close),
              onPressed: () {},
            ),
            inline: true,
            textAlign: TextAlign.center,
            textColor: Colors.blue,
            iconColor: Colors.amber,
            style: const WxListTileStyle.dense(),
            onTap: () {},
          ),
          const SizedBox(height: 40),
        ],
      ),
    );
  }
}

class Wrapper extends StatelessWidget {
  const Wrapper({
    super.key,
    required this.children,
  });

  final List<Widget> children;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Center(
          child: ConstrainedBox(
            constraints: const BoxConstraints(maxWidth: 400),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: children,
            ),
          ),
        ),
      ),
    );
  }
}

class Example extends StatelessWidget {
  const Example({
    super.key,
    required this.title,
    required this.child,
  });

  final String title;
  final Widget child;

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        Padding(
          padding: const EdgeInsets.fromLTRB(10, 0, 0, 0 ),
          child: WxText.labelLarge(title),
        ),
        Card.outlined(
          child: SizedBox(
            width: double.infinity,
            child: Padding(
              padding: const EdgeInsets.all(15.0 ),
              child: Center(child: child),
            ),
          ),
        ),
        const SizedBox(height: 11 ),
      ],
    );
  }
}

使用说明

  1. 基本磁贴 (WxTile)

    WxTile(
      spacing: 10,
      leading: Text('Leading'),
      trailing: Text('Trailing'),
      child: Text('Horizontal Tile'),
    )
    
  2. 文本磁贴 (WxTextTile)

    WxTextTile(
      title: Text('Title'),
      subtitle: Text('Subtitle'),
      spacing: 5,
      align: TextAlign.right,
    )
    
  3. 列表磁贴 (WxListTile)

    WxListTile(
      title: const Text('title'),
      subtitle: const Text('subtitle'),
      leading: const Icon(Icons.access_time),
      trailing: IconButton(
        icon: const Icon(Icons.close),
        onPressed: () {},
      ),
      textColor: Colors.blue,
      iconColor: Colors.amber,
      onTap: () {},
    )
    
  4. 内联列表磁贴 (WxListTile)

    WxListTile(
      title: const Text('title'),
      subtitle: const Text('subtitle'),
      leading: const Icon(Icons.access_time),
      trailing: IconButton(
        icon: const Icon(Icons.close),
        onPressed: () {},
      ),
      inline: true,
      textAlign: TextAlign.center,
      textColor: Colors.blue,
      iconColor: Colors.amber,
      style: const WxListTileStyle.dense(),
      onTap: () {},
    )
    

更多关于Flutter自定义磁贴布局插件wx_tile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义磁贴布局插件wx_tile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用自定义磁贴布局插件wx_tile的代码案例。这个插件允许你创建磁贴布局,类似于Windows磁贴界面。需要注意的是,你需要先确保已经在pubspec.yaml文件中添加了wx_tile依赖。

pubspec.yaml

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

main.dart

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('wx_tile Demo'),
      ),
      body: Center(
        child: WXTileLayout(
          // 设置磁贴布局的方向,可以是 Axis.horizontal 或 Axis.vertical
          axis: Axis.horizontal,
          // 设置磁贴之间的间距
          mainAxisSpacing: 10.0,
          crossAxisSpacing: 10.0,
          // 磁贴列表
          children: <Widget>[
            WXTile(
              // 磁贴的背景颜色
              color: Colors.blue,
              // 磁贴的子组件,可以是任意 Widget
              child: Center(
                child: Text(
                  'Tile 1',
                  style: TextStyle(color: Colors.white),
                ),
              ),
              // 点击磁贴时的回调
              onTap: () {
                print('Tile 1 tapped');
                // 这里可以添加导航到其它页面的代码
              },
            ),
            WXTile(
              color: Colors.green,
              child: Center(
                child: Text(
                  'Tile 2',
                  style: TextStyle(color: Colors.white),
                ),
              ),
              onTap: () {
                print('Tile 2 tapped');
              },
            ),
            WXTile(
              color: Colors.red,
              child: Center(
                child: Text(
                  'Tile 3',
                  style: TextStyle(color: Colors.white),
                ),
              ),
              onTap: () {
                print('Tile 3 tapped');
              },
            ),
            // 可以添加更多磁贴
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加wx_tile依赖。
  2. 主应用:创建一个基本的Flutter应用,包含一个MyApp和一个MyHomePage
  3. 磁贴布局:在MyHomePage中使用WXTileLayout来创建磁贴布局。
  4. 磁贴项:每个磁贴使用WXTile组件,可以指定颜色、子组件和点击回调。

这个示例展示了如何使用wx_tile插件来创建一个简单的磁贴布局。你可以根据需要调整磁贴的数量、颜色和点击事件处理逻辑。如果wx_tile插件有更复杂的配置选项或API,请参考其官方文档以获取更多信息。

回到顶部