Flutter自定义UI组件插件utopia_widgets的使用

Flutter 自定义 UI 组件插件 utopia_widgets 的使用

utopia_widgets 是一个包含多种基本 UI 组件的 Flutter 插件。这些组件可以帮助开发者快速构建复杂的用户界面。

高亮功能

FormLayout 和 TopBottomLayout

FormLayoutTopBottomLayout 是两种基本布局,适用于内容较长或较短的屏幕。这两种布局可以确保用户在不滚动到底部的情况下提交表单。

CrossFadeIndexedStack

CrossFadeIndexedStack 类似于 IndexedStack,但不同之处在于页面在切换时会渐变过渡,并且可以延迟初始化。它非常适合用于受 BottomNavigationBar 控制的屏幕内容。

示例代码

以下是一个完整的示例代码,演示如何使用 utopia_widgets 中的组件。

import 'package:flutter/material.dart';
import 'package:utopia_widgets_example/pages/constrained_aspect_ratio.dart';
import 'package:utopia_widgets_example/pages/cross_fade_indexed_stack.dart';
import 'package:utopia_widgets_example/pages/form_layout.dart';
import 'package:utopia_widgets_example/pages/multi_widget.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Builder(
        builder: (context) => Scaffold(
          appBar: AppBar(title: const Text("Utopia widgets example")),
          body: Column(
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              // 按钮列表,点击后导航到对应的页面
              for (final page in _pageMap.entries)
                ElevatedButton(
                  onPressed: () => Navigator.of(context).push(
                    MaterialPageRoute(builder: (context) => page.value),
                  ),
                  child: Text(page.key),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

// 定义页面映射
final _pageMap = {
  "FormLayout": const FormLayoutPage(),
  "CrossFadeIndexedStack": const CrossFadeIndexedStackPage(),
  "MultiWidget": const MultiWidgetPage(),
  "ConstrainedAspectRatio": const ConstrainedAspectRatioPage(),
};

页面实现

以下是几个页面的具体实现代码:

FormLayoutPage

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

class FormLayoutPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return FormLayout(
      children: [
        TextFormField(
          decoration: InputDecoration(labelText: "用户名"),
        ),
        TextFormField(
          decoration: InputDecoration(labelText: "密码"),
        ),
        ElevatedButton(
          onPressed: () {},
          child: Text("提交"),
        ),
      ],
    );
  }
}

CrossFadeIndexedStackPage

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

class CrossFadeIndexedStackPage extends StatefulWidget {
  [@override](/user/override)
  _CrossFadeIndexedStackPageState createState() => _CrossFadeIndexedStackPageState();
}

class _CrossFadeIndexedStackPageState extends State<CrossFadeIndexedStackPage> with TickerProviderStateMixin {
  int _selectedIndex = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        BottomNavigationBar(
          currentIndex: _selectedIndex,
          onTap: (index) {
            setState(() {
              _selectedIndex = index;
            });
          },
          items: const [
            BottomNavigationBarItem(icon: Icon(Icons.home), label: "首页"),
            BottomNavigationBarItem(icon: Icon(Icons.search), label: "搜索"),
            BottomNavigationBarItem(icon: Icon(Icons.person), label: "个人中心"),
          ],
        ),
        Expanded(
          child: CrossFadeIndexedStack(
            index: _selectedIndex,
            children: [
              Container(color: Colors.red, child: Center(child: Text("首页"))),
              Container(color: Colors.green, child: Center(child: Text("搜索"))),
              Container(color: Colors.blue, child: Center(child: Text("个人中心"))),
            ],
          ),
        ),
      ],
    );
  }
}

MultiWidgetPage

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

class MultiWidgetPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MultiWidget(
      children: [
        Text("这是第一个子部件"),
        Text("这是第二个子部件"),
        Text("这是第三个子部件"),
      ],
    );
  }
}

ConstrainedAspectRatioPage

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

class ConstrainedAspectRatioPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return ConstrainedBox(
      constraints: BoxConstraints.tight(Size(200.0, 200.0)),
      child: ConstrainedAspectRatio(
        aspectRatio: 16 / 9,
        child: Container(
          color: Colors.amber,
          child: Center(child: Text("固定宽高比")),
        ),
      ),
    );
  }
}

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

1 回复

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


utopia_widgets 是一个用于 Flutter 的自定义 UI 组件库,它提供了一系列预制的组件和工具,帮助开发者快速构建美观且功能丰富的用户界面。以下是如何使用 utopia_widgets 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  utopia_widgets: ^1.0.0  # 请使用最新的版本号

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

2. 导入包

在你的 Dart 文件中导入 utopia_widgets

import 'package:utopia_widgets/utopia_widgets.dart';

3. 使用组件

utopia_widgets 提供了多种自定义组件,以下是一些常用组件的示例:

UtopiaButton

UtopiaButton 是一个自定义按钮组件,支持多种样式和点击事件。

UtopiaButton(
  text: 'Click Me',
  onPressed: () {
    print('Button Pressed!');
  },
  style: UtopiaButtonStyle.primary, // 可选样式
)

UtopiaTextField

UtopiaTextField 是一个自定义文本输入框,支持多种输入类型和验证。

UtopiaTextField(
  hintText: 'Enter your name',
  onChanged: (value) {
    print('Text changed: $value');
  },
  validator: (value) {
    if (value.isEmpty) {
      return 'Please enter your name';
    }
    return null;
  },
)

UtopiaCard

UtopiaCard 是一个自定义卡片组件,支持阴影、圆角等样式。

UtopiaCard(
  child: Column(
    children: [
      Text('Card Title'),
      Text('Card Content'),
    ],
  ),
  elevation: 4.0, // 阴影
  borderRadius: BorderRadius.circular(8.0), // 圆角
)

4. 自定义主题

utopia_widgets 允许你自定义主题以匹配你的应用风格。你可以通过 UtopiaTheme 来设置全局主题:

MaterialApp(
  theme: UtopiaTheme.light(), // 使用默认的浅色主题
  home: Scaffold(
    appBar: AppBar(
      title: Text('Utopia Widgets Example'),
    ),
    body: Center(
      child: UtopiaButton(
        text: 'Hello Utopia',
        onPressed: () {},
      ),
    ),
  ),
)
回到顶部