Flutter容器组件插件the_containers的使用

Flutter 容器组件插件 the_containers 的使用

TheContainers

TheContainers 是一组容器,简化了布局工作。它们是 Row、Column、Container 和 AnimatedContainer 的可替换版本,并允许在子元素之间设置自定义间距。

SeparatedRow 和 SeparatedColumn

SeparatedRow 和 SeparatedColumn 是 Row 和 Column 的替代品。它们允许通过设置 separatorSizeseparator 属性来添加子元素之间的间距。

ContainerRow 和 ContainerColumn

ContainerRow 和 ContainerColumn 是可以作为行或列使用的 Container。除了所有与 Container 相关的属性外,还可以设置 separatorSizeseparator 属性。

AnimatedContainerRow 和 AnimatedContainerColumn

AnimatedContainerRow 和 AnimatedContainerColumn 是可以作为行或列使用的 AnimatedContainer。除了所有与 AnimatedContainer 相关的属性外,还可以设置 separatorSizeseparator 属性。

示例代码

// 忽略文件级别的公共成员 API 文档

import 'dart:async';

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

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

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

  // 这个小部件是你的应用的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TheContainers Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

// 枚举类型用于选择不同的标签页类型
enum TabType {
  separatedRow,
  separatedColumn,
  containerRow,
  containerColumn,
  animatedContainerRow,
  animatedContainerColumn;

  // 获取标签页名称
  String get tabName => name[0].toUpperCase() + name.substring(1);
}

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

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _itemCount = 3;

  late final Timer _timer;

  double _padding = 16;

  [@override](/user/override)
  void initState() {
    super.initState();

    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (mounted) {
        setState(() {
          _padding = _padding > 16 ? 4 : 32;
        });
      }
    });
  }

  [@override](/user/override)
  void dispose() {
    _timer.cancel();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final tabs = TabType.values.map((e) => Tab(text: e.tabName)).toList();
    final children = TabType.values.map(_getTabView).toList();

    return DefaultTabController(
      length: tabs.length,
      child: Scaffold(
        appBar: AppBar(
          title: const Text('TheContainers Demo'),
          bottom: TabBar(
            isScrollable: true,
            tabAlignment: TabAlignment.center,
            tabs: tabs,
          ),
        ),
        body: TabBarView(
          children: children,
        ),
      ),
    );
  }

  // 返回一个居中的滚动视图
  Widget _getTabContainer({
    required Axis scrollDirection,
    required Widget child,
  }) {
    return Center(
      child: SingleChildScrollView(
        scrollDirection: scrollDirection,
        child: child,
      ),
    );
  }

  // 根据标签页类型返回相应的视图
  Widget _getTabView(TabType tabType) {
    final children = List.generate(
      _itemCount,
      (index) => Container(
        color: Colors.deepPurple[100 * (index + 1)],
        height: 100,
        width: 100,
        child: Center(
          child: Text(
            'Item $index',
            style: const TextStyle(fontSize: 20),
          ),
        ),
      ),
    );

    return switch (tabType) {
      TabType.separatedRow => _getTabContainer(
          scrollDirection: Axis.horizontal,
          child: SeparatedRow(
            separatorSize: 16,
            children: children,
          ),
        ),
      TabType.separatedColumn => _getTabContainer(
          scrollDirection: Axis.vertical,
          child: SeparatedColumn(
            separatorSize: 16,
            children: children,
          ),
        ),
      TabType.containerRow => _getTabContainer(
          scrollDirection: Axis.horizontal,
          child: ContainerRow(
            separatorSize: 16,
            color: Colors.green[300],
            padding: EdgeInsets.all(_padding),
            children: children,
          ),
        ),
      TabType.containerColumn => _getTabContainer(
          scrollDirection: Axis.vertical,
          child: ContainerColumn(
            separatorSize: 16,
            color: Colors.green[300],
            padding: EdgeInsets.all(_padding),
            children: children,
          ),
        ),
      TabType.animatedContainerRow => _getTabContainer(
          scrollDirection: Axis.horizontal,
          child: AnimatedContainerRow(
            duration: const Duration(milliseconds: 300),
            separatorSize: 16,
            color: Colors.green[300],
            padding: EdgeInsets.all(_padding),
            children: children,
          ),
        ),
      TabType.animatedContainerColumn => _getTabContainer(
          scrollDirection: Axis.vertical,
          child: AnimatedContainerColumn(
            duration: const Duration(milliseconds: 300),
            separatorSize: 16,
            color: Colors.green[300],
            padding: EdgeInsets.all(_padding),
            children: children,
          ),
        ),
    };
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用the_containers插件的详细示例。the_containers是一个提供多种容器组件的Flutter插件,可以帮助开发者快速创建具有不同布局和外观的UI。

首先,确保你已经在pubspec.yaml文件中添加了the_containers依赖:

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

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

接下来,让我们看一些如何使用the_containers提供的组件的代码示例。

示例代码

1. 使用CardContainer

CardContainer提供了一个带有阴影和圆角的卡片容器。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('CardContainer 示例'),
        ),
        body: Center(
          child: CardContainer(
            elevation: 10,
            shadowColor: Colors.grey.withOpacity(0.5),
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(15),
            ),
            child: Container(
              width: 200,
              height: 100,
              color: Colors.blue,
              child: Center(
                child: Text(
                  'Card Container',
                  style: TextStyle(color: Colors.white),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

2. 使用GradientContainer

GradientContainer提供了一个带有线性渐变的容器。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('GradientContainer 示例'),
        ),
        body: Center(
          child: GradientContainer(
            gradient: LinearGradient(
              colors: [Colors.red, Colors.blue],
              begin: Alignment.topLeft,
              end: Alignment.bottomRight,
            ),
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(20),
            ),
            child: Container(
              width: 200,
              height: 100,
              child: Center(
                child: Text(
                  'Gradient Container',
                  style: TextStyle(color: Colors.white),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

3. 使用ShadowContainer

ShadowContainer提供了一个带有阴影效果的容器。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('ShadowContainer 示例'),
        ),
        body: Center(
          child: ShadowContainer(
            elevation: 20,
            shadowColor: Colors.black.withOpacity(0.3),
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
            child: Container(
              width: 200,
              height: 100,
              color: Colors.green,
              child: Center(
                child: Text(
                  'Shadow Container',
                  style: TextStyle(color: Colors.white),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}

这些示例展示了如何使用the_containers插件提供的不同容器组件来构建具有不同外观和布局的UI。你可以根据需要调整这些组件的属性,以实现所需的效果。

回到顶部