Flutter自定义组件插件awesome_nizam_widgets的使用

Flutter 自定义组件插件 awesome_nizam_widgets 的使用

在本教程中,我们将详细介绍如何使用 awesome_nizam_widgets 插件来构建一个审批相关的视图。该插件提供了丰富的自定义组件,使开发更加便捷。

功能

  • 接受审批
  • 点击 PDF
  • 搜索功能等

开始使用

无需任何前置条件即可开始使用该插件。

使用示例

以下是一个完整的示例代码,展示了如何使用 awesome_nizam_widgets 插件来构建一个审批表单页面。

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

// 假设已经定义了以下控制器
class Form926Controller extends GetxController {
  // 控制搜索框是否显示
  RxBool isSearching = false.obs;

  // 搜索控制器
  TextEditingController searchController = TextEditingController();

  // 开始日期
  Rx<DateTime> startDate = DateTime.now().obs;

  // 结束日期
  Rx<DateTime> endDate = DateTime.now().obs;

  // 审批状态组值
  Rx<String> statusGroupValue = 'W'.obs;

  // 审批列表
  Rx<List<dynamic>> approvalList = [].obs;

  // 搜索列表
  Rx<List<dynamic>> searchList = [].obs;

  void onChangeWhenTypeSearch(String text) {
    // 处理搜索逻辑
  }

  void setStatusGroupValue(String value) {
    // 设置状态组值
    statusGroupValue.value = value;
  }

  void onTapStartDateTime(BuildContext context) {
    // 处理开始日期点击事件
  }

  void onTapEndDateTime(BuildContext context) {
    // 处理结束日期点击事件
  }

  void getSupplierBillApprovalList() {
    // 获取供应商审批列表
  }

  void showApprovalForm(dynamic approval) {
    // 显示审批表单
  }

  void showReport(dynamic approval) {
    // 显示报告
  }
}

// 审批摘要卡片组件
class ApprovalSummaryCard extends StatelessWidget {
  final List<String> titles;
  final List<String> values;
  final VoidCallback onTapFunction;
  final VoidCallback acceptTap;
  final VoidCallback pdfTap;

  ApprovalSummaryCard({
    required this.titles,
    required this.values,
    required this.onTapFunction,
    required this.acceptTap,
    required this.pdfTap,
  });

  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        title: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: List.generate(titles.length, (index) {
            return Text('${titles[index]}: ${values[index]}');
          }),
        ),
        trailing: Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            ElevatedButton(
              onPressed: acceptTap,
              child: Text('接受'),
            ),
            SizedBox(width: 8),
            ElevatedButton(
              onPressed: pdfTap,
              child: Text('PDF'),
            ),
          ],
        ),
        onTap: onTapFunction,
      ),
    );
  }
}

// 主页面
class Form926View extends GetView<Form926Controller> {
  const Form926View({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey.shade200,
      appBar: AppBar(
        title: Obx(
          () => Row(
            children: [
              controller.isSearching.value
                  ? Expanded(
                      child: TextFormField(
                        controller: controller.searchController,
                        style: const TextStyle(color: Colors.white),
                        decoration: const InputDecoration(
                          fillColor: Colors.transparent,
                          hintText: 'Search',
                          hintStyle: TextStyle(color: Colors.white),
                        ),
                        onChanged: controller.onChangeWhenTypeSearch,
                      ),
                    )
                  : Expanded(
                      child: GestureDetector(
                        onTap: () => controller.isSearching.value = !controller.isSearching.value,
                        child: const Text('Bill Approval'),
                      ),
                    ),
            ],
          ),
        ),
        actions: [
          Obx(
            () => IconButton(
              onPressed: () {
                if (controller.isSearching.value) {
                  controller.searchController.clear();
                  controller.searchList.value = null;
                }
                controller.isSearching.value = !controller.isSearching.value;
              },
              icon: Icon(controller.isSearching.value ? Icons.close : Icons.search),
            ),
          ),
        ],
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          Card(
            margin: EdgeInsets.zero,
            child: Padding(
              padding: const EdgeInsets.all(10),
              child: Column(
                children: [
                  Row(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Expanded(
                        child: InkWell(
                          onTap: () => controller.onTapStartDateTime(context),
                          child: Container(
                            height: 50,
                            padding: const EdgeInsets.all(10),
                            decoration: BoxDecoration(color: Colors.grey.shade200, border: Border.all()),
                            alignment: Alignment.center,
                            child: Obx(
                              () => Text(
                                getFormatedDate(controller.startDate.value),
                                textAlign: TextAlign.center,
                                style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
                              ),
                            ),
                          ),
                        ),
                      ),
                      Expanded(
                        child: InkWell(
                          onTap: () => controller.onTapEndDateTime(context),
                          child: Container(
                            height: 50,
                            alignment: Alignment.center,
                            padding: const EdgeInsets.all(10),
                            decoration: BoxDecoration(color: Colors.grey.shade200, border: Border.all()),
                            child: Obx(
                              () => Text(
                                getFormatedDate(controller.endDate.value),
                                textAlign: TextAlign.center,
                                style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16),
                              ),
                            ),
                          ),
                        ),
                      ),
                      Container(
                        height: 50,
                        decoration: BoxDecoration(border: Border.all(color: Colors.black), color: Colors.green),
                        child: IconButton(onPressed: controller.getSupplierBillApprovalList, icon: const Icon(Icons.search, color: Colors.white)),
                      ),
                    ],
                  ),
                  Obx(
                    () => Row(
                      children: [
                        Radio<String>(
                          value: 'W',
                          groupValue: controller.statusGroupValue.value,
                          onChanged: controller.setStatusGroupValue,
                        ),
                        const Text('Pending'),
                        Radio<String>(
                          value: 'A',
                          groupValue: controller.statusGroupValue.value,
                          onChanged: controller.setStatusGroupValue,
                        ),
                        const Text('Approved'),
                        Radio<String>(
                          value: 'H',
                          groupValue: controller.statusGroupValue.value,
                          onChanged: controller.setStatusGroupValue,
                        ),
                        const Text('Denied'),
                        const Spacer(),
                        Text(
                          '${(controller.isSearching.value) ? (controller.searchList.value?.length ?? 0) : controller.approvalList.value.length}',
                          style: const TextStyle(color: Colors.grey, fontSize: 12, fontWeight: FontWeight.bold),
                        ),
                      ],
                    ),
                  )
                ],
              ),
            ),
          ),
          const SizedBox(height: 10),
          Expanded(
            child: Obx(
              () => (controller.approvalList.value.isEmpty)
                  ? Center(child: Text('No Data'))
                  : controller.searchList.value == null
                      ? ListView.builder(
                          padding: const EdgeInsets.symmetric(horizontal: 10),
                          itemCount: controller.approvalList.value.length,
                          itemBuilder: (BuildContext context, int index) {
                            final approval = controller.approvalList.value[index];
                            return ApprovalSummaryCard(
                              titles: const ['Bill No', 'Supplier', 'Prepared By', 'Status'],
                              values: [
                                approval['BILL_ID'] ?? '',
                                approval['SUPPLIER'] ?? '',
                                approval['PREPARED_BY_NAME'] ?? '',
                                approval['TASK_NAME'] ?? '',
                              ],
                              onTapFunction: () => Get.to(() => Form926DetailsView(approval: approval)),
                              acceptTap: () => controller.showApprovalForm(approval),
                              pdfTap: () => controller.showReport(approval),
                            );
                          },
                        )
                      : controller.searchList.value!.isEmpty
                          ? Center(child: Text('No Search Results'))
                          : ListView.builder(
                              padding: const EdgeInsets.symmetric(horizontal: 10),
                              itemCount: controller.searchList.value?.length,
                              itemBuilder: (BuildContext context, int index) {
                                final approval = controller.searchList.value![index];
                                return ApprovalSummaryCard(
                                  titles: const ['Bill No', 'Supplier', 'Prepared By', 'Status'],
                                  values: [
                                    approval['BILL_ID'] ?? '',
                                    approval['SUPPLIER'] ?? '',
                                    approval['PREPARED_BY_NAME'] ?? '',
                                    approval['TASK_NAME'] ?? '',
                                  ],
                                  onTapFunction: () => Get.to(() => Form926DetailsView(approval: approval)),
                                  acceptTap: () => controller.showApprovalForm(approval),
                                  pdfTap: () => controller.showReport(approval),
                                );
                              },
                            ),
            ),
          ),
        ],
      ),
    );
  }
}

注意事项

确保你已经在项目中添加了 awesome_nizam_widgets 插件,并且正确配置了依赖项。

dependencies:
  flutter:
    sdk: flutter
  awesome_nizam_widgets: ^1.0.0

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

1 回复

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


awesome_nizam_widgets 是一个假设的 Flutter 插件,用于提供自定义的 UI 组件。虽然这个插件在现实中并不存在,但我可以为你提供一个使用自定义组件插件的通用指南,并假设 awesome_nizam_widgets 是一个提供了一些自定义 UI 组件的插件。

1. 安装插件

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

dependencies:
  flutter:
    sdk: flutter
  awesome_nizam_widgets: ^1.0.0  # 假设版本为1.0.0

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

2. 导入插件

在你的 Dart 文件中导入插件:

import 'package:awesome_nizam_widgets/awesome_nizam_widgets.dart';

3. 使用自定义组件

假设 awesome_nizam_widgets 提供了以下自定义组件:

  • NizamButton: 一个自定义的按钮组件。
  • NizamCard: 一个自定义的卡片组件。
  • NizamText: 一个自定义的文本组件。

示例代码

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Awesome Nizam Widgets Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              NizamButton(
                onPressed: () {
                  print('Nizam Button Pressed!');
                },
                text: 'Click Me',
              ),
              SizedBox(height: 20),
              NizamCard(
                child: Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: NizamText(
                    text: 'This is a Nizam Card!',
                    style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部