Flutter常用组件集合插件essential_components的使用

Flutter常用组件集合插件essential_components的使用

en-US

essential_components

一个库,旨在简化Web应用程序开发人员使用AngularDart的工作。此库将实现几个关键组件,以加快AngularDart Web应用程序的开发。

组件画廊

essential-components-gallery

开始使用

  1. 创建一个新的AngularDart应用:https://angulardart.dev/guide/setup
  2. pubspect.yaml中添加essential_components依赖:
    dependencies:
        ...
        essential_components: any
        ...
    
  3. theme.scss中添加CSS样式表链接:
    <head>
      @import "package:bootstrap_sass/scss/bootstrap";
      @import 'package:essential_components/scss/icomoon.scss';
      @import 'package:essential_components/scss/bootstrap.scss';
      @import 'package:essential_components/scss/bootstrap_limitless.scss';
      @import 'package:essential_components/scss/layout.scss';
      @import 'package:essential_components/scss/components.scss';
      @import 'package:essential_components/scss/colors.scss';
      @import 'package:essential_components/scss/fix.scss';
    </head>
    
  4. 在你的组件中添加所需的essential_components指令:
    import 'package:essential_components/essential_components.dart';
    
    [@Component](/user/Component)(
        // ...
        directives: const [
          EssentialToastComponent,
          EssentialDataTableComponent,
          EssentialDataTableComponent,
          EssentialSelectDialogComponent,
          MoneyMaskDirective,
          EssentialAccordionComponent,
          EsAccordionPanelComponent,
          EssentialModalComponent,
          EssentialDropdownDialogComponent,
          EssentialSimpleSelectComponent,
          TextMaskDirective,
          MoneyMaskDirective,
          AnoValidator,
          DateTimeValueAccessor,])
    

组件

DataTable

Toast

SelectDialog

DropdownDialog

NotificationToast

Acordion

Modal

SimpleDialog

SimpleLoading

SimpleCardModel

SimpleTabs

DynamicTabs

SimpleSelect

FontAwesome

TimelineComponent

DatePickerComponent

辅助API

RestClient

SimpleXlsx

指令

ano_validator

datetime_value_accessor

decimal_value_accessor

maxlength_directive

money_mask_directive

textmask_directive

validator_response

collapse

dropdown

button

Example DataTable

在模型类中实现IDataTableRender接口,定义将在DataTable中显示的字段。

import 'package:essential_components/essential_components.dart';
import 'dart:html' as html;

class User implements IDataTableRender {
  int id;
  String name;
  String username;
  String email;

  static List<String> status = ['active', 'inactive', 'canceled', 'paused'];

  User.fromJson(Map<String, dynamic> json) {
    try {
      id = json.containsKey("id") ? json['id'] : -1;
      name = json.containsKey("name") ? json['name'] : "";
    } catch (e) {
      print('User.fromJson: ${e}');
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> json = Map<String, dynamic>();
    if (this.id != null) {
      json['id'] = this.id;
    }
    json['name'] = this.name;
  }

  @override
  DataTableRow getRowDefinition() {
    var settings = DataTableRow();
    settings.addSet(DataTableColumn(
        key: "name",
        value: name,
        title: "Name",
        customRender: (html.TableCellElement cellElement) {
          if (name == "Leanne Graham") {
            cellElement?.closest('tr')?.style?.background = "#e8fbee";
            return '''<span style="font-size: .8125rem;
    padding: 5px 15px; color: #fff; font-weight: 400;    
    border-radius: 10px; background: #2fa433d9;">$name</span>''';
          }
          return name;
        }));

    settings.addSet(DataTableColumn(key: "username", value: username, title: "username", limit: 20));
    return settings;
  }
}

在组件中导入essential_components并设置方法和属性,这些方法和属性将用于DataTable以获取和过滤数据。

在这个例子中,我使用了RestClientGeneric API来获取数据,并使用SimpleLoadingComponent来显示加载动画。

import 'package:angular/angular.dart';
import 'package:angular_forms/angular_forms.dart';
import 'package:angular_router/angular_router.dart';

//components
import 'package:essential_components/essential_components.dart';

//models
import 'src/models/user.dart';

import 'dart:html' as html;

[@Component](/user/Component)(
    selector: 'my-app',
    styleUrls: ['app_component.css'],
    templateUrl: 'app_component.html',
    directives: [
      formDirectives,
      coreDirectives,
      EssentialToastComponent,
      routerDirectives,
      EssentialDataTableComponent,
      MaxlengthDirective,
      esDynamicTabsDirectives,
      EssentialSimpleSelectComponent,
      EsSimpleSelectOptionComponent,
      EsDatePickerPopupComponent,
      EsDatePickerComponent
    ],
    exports: [User])
class AppComponent implements OnInit {
  RList<User> users;
  User selected;
  SimpleLoadingComponent loading;
  @ViewChild('dataTable')
  EssentialDataTableComponent dataTable;
  //rest client for get JSON data from backend
  RestClientGeneric rest;

  static EssentialNotificationService notificationService = EssentialNotificationService();

  @ViewChild('card')
  html.DivElement card;

  AppComponent() {
    loading = SimpleLoadingComponent();
    //init rest client for get JSON data from backend
    RestClientGeneric.basePath = ''; //example /api/v1/
    RestClientGeneric.host = "127.0.0.1";
    RestClientGeneric.protocol = UriMuProtoType.http;
    RestClientGeneric.port = 8080;
    rest = RestClientGeneric<User>(factories: {User: (x) => User.fromJson(x)});
  }

  @override
  void ngOnInit() async {
    //display loading animation on container div card
    loading.show(target: card);
    //loading data from server side REST API
    var resp = await rest.getAll('/mockdata.json', queryParameters: DataTableFilter().getParams());
    loading.hide();
    if (resp.status == RestStatus.SUCCESS) {
      users = resp.dataTypedList;
    } else {
      print(resp.message);
      print(resp.exception);
    }
  }

  //on click in row of dataTable
  void onRowClick(User selected) {
    this.selected = selected;
  }

  bool hasSeletedItems() {
    return dataTable.selectedItems != null && dataTable.selectedItems.isNotEmpty;
  }

  Future<void> onRequestData(DataTableFilter dataTableFilter) async {
    var resp = await rest.getAll('/user', queryParameters: dataTableFilter.getParams());
    if (resp.status == RestStatus.SUCCESS) {
      this.users = resp.dataTypedList;
    } else {
      dataTable.setErrorOccurred();
    }
  }

  Future<void> reloadTableOnChange(e) async {
    dataTable.reload();
  }

  onDelete() {
    SimpleDialogComponent.showConfirm("Are you sure you want to remove this item? The operation cannot be undone.",
        confirmAction: () {
      if (hasSeletedItems()) {
        AppComponent.notificationService.add('success', 'App', "Success");
      } else {
        AppComponent.notificationService.add('danger', 'App', "Select items");
      }
    });
  }
}

在模板HTML中:

<h1>DataTable Exemple</h1>
<div #card class="card">
    <div style="padding: 15px;">
        <div class="row">
            <div class="col-md-6 text-truncate">
                <span style="font-size: 1.0625rem;">Sample example DataTable</span>
            </div>
            <div class="col-md-3 ">
                <div class="form-group">
                    <es-simple-select displaytype="select" buttonText="Todos"
                        [options]="User.status" (change)="reloadTableOnChange($event)">
                        <es-simple-select-option [value]="null" selected>Todos</es-simple-select-option>
                    </es-simple-select>
                </div>
            </div>

            <div class="col-md-3 text-right">
                <button type="button"
                    class="btn btn-primary legitRipple">Add</button>
                <button (click)="onDelete()" type="button" class="btn bg-pink-400 legitRipple"
                    [disabled]="!hasSeletedItems()">
                    Delete
                </button>
            </div>
        </div>
    </div>

    <es-data-table #dataTable [data]="users" (rowClick)="onRowClick($event)" (dataRequest)="onRequestData($event)">
    </es-data-table>
</div>

<es-notification-outlet [service]='notificationService'></es-notification-outlet>

pt-BR

Essencials Components

一个库,旨在简化Web应用程序开发人员使用AngularDart的工作。
正在建设中

安装

  1. 在您的包管理器中的pubspec.yaml文件中添加依赖项。
    dependencies:
      essential_components: ^0.1.2
    
  2. 使用命令pub get安装。
  3. 要使用,只需在您的组件中导入实现:
    import 'package:essential_components/essential_components.dart';
    

存在的组件

  • Datatable
  • Select Dialog
  • Notification
  • Toast

如何使用

使用基本组件的方式非常简单。

Datatable

Datatable 是一个组件,它组织从服务中消费的数据,这些数据必须具有定义明确的请求和响应结构。

首先,存在一组作为“查询参数”发送的数据。这些数据对于过滤功能非常重要。因此,如果开发者希望基于过滤器进行搜索,则应用程序后端应处理这些数据。这些参数的结构如下:

int limit;
int offset;
String search;
String orderBy;
String orderDir;

默认情况下,与应用程序后端不同,Datatable 已在前端(Dart)中处理了这些数据,因此过滤会自动发生。

现在我们已经了解了过滤的基础知识,接下来我们将重点放在Datatable的渲染上。

定义业务模型

为了让Datatable正常工作,第一步是实现带有IDataTableRender接口的业务模型。例如:

class Categoria implements IDataTableRender {
  int id;
  String nome;

  @override
  DataTableRow getRowDefinition() {
    DataTableRow settings = DataTableRow();
    settings.addSet(DataTableColumn(key: 'id', value: idAsString, title: 'Id'));
    settings.addSet(DataTableColumn(key: 'nome', value: nome, title: 'Nome'));
    return settings;
  }
}

该类覆盖了一个返回DataTableRow的方法,名为getRowDefinition()。此方法用于配置Datatable的标题行。实例化一行,并使用DataTableColumn设置列。DataTableColumn接收一些与其配置相关的参数:

class DataTableColumn {
    dynamic key;
    dynamic value;
    DataTableColumnType type;
    String title;
    int limit;
    String format;
    bool primaryDisplayValue;
}

继续我们的类别示例:

class Categoria implements IDataTableRender {
  int id;
  String nome;
}
  • dynamic key; // 这将是键。例如:‘nome’
  • dynamic value; // 这将是字段的值。例如:nome
  • DataTableColumnType type; // DataTableColumnType.text。这些是存在于枚举中的类型。它们是:img, text, date, dateTime
  • String title; // ‘Id’
  • int limit; // 限制字符数量
  • String format; // 对于某些类型有特定格式。
  • bool primaryDisplayValue; // 如果要显示单个列,哪个列将被显示。在选择对话框中经常使用。

现在,表格的渲染已经预先设定,可以在您的Angular Dart组件中进行操作。

为此,只需在视图中实例化组件即可。

@ViewChild('dataTable')
EssentialDataTableComponent dataTable;

这张表会发出一些事件。其中最重要的包括:

  • rowClick: 点击时,对象会被返回。
  • dataRequest: 与要呈现的过滤器相关。

内联视图模板突出显示如下:

<es-data-table
    #dataTable
    [data]="categorias"
    (rowClick)="onRowClick($event)"
    (dataRequest)="onRequestData($event)">
</es-data-table>

方法onRowClient($event)onRequestData($event) 都需要在组件中实现,定义业务逻辑。

例如… 在onRowClick($event)中,可以导航到另一页面并保存对象引用以更新数据对象。

onRowClick(event) {
    this.categoria = event; // 接收对象实例
    goToDetail();
}

只需要实现OnRequest data来收集表格过滤器。

Future<void> onRequestData(DataTableFilter dataTableFilter) async {
    await getAllCampanhas(filters: dataTableFilter);
}

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

1 回复

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


essential_components 是一个 Flutter 插件,旨在提供一组常用的、高质量的 UI 组件,帮助开发者快速构建应用程序。这个插件包含了许多常用的组件,如按钮、卡片、对话框、表单元素等,可以显著减少开发时间并提高代码的可维护性。

安装

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

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

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

使用示例

以下是一些常用组件的使用示例:

1. 按钮 (EssentialButton)

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Essential Components Example'),
      ),
      body: Center(
        child: EssentialButton(
          onPressed: () {
            print('Button Pressed!');
          },
          text: 'Click Me',
        ),
      ),
    );
  }
}

2. 卡片 (EssentialCard)

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Essential Components Example'),
      ),
      body: Center(
        child: EssentialCard(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: Text('This is a card'),
          ),
        ),
      ),
    );
  }
}

3. 对话框 (EssentialDialog)

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Essential Components Example'),
      ),
      body: Center(
        child: EssentialButton(
          onPressed: () {
            EssentialDialog.show(
              context,
              title: 'Dialog Title',
              content: Text('This is a dialog'),
              actions: [
                EssentialButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  text: 'Close',
                ),
              ],
            );
          },
          text: 'Show Dialog',
        ),
      ),
    );
  }
}

4. 表单元素 (EssentialTextField)

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Essential Components Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: EssentialTextField(
          labelText: 'Enter your name',
          onChanged: (value) {
            print('Name: $value');
          },
        ),
      ),
    );
  }
}

其他组件

essential_components 还提供了许多其他组件,如 EssentialCheckboxEssentialRadioEssentialSwitch 等。你可以根据需要在项目中使用这些组件。

自定义主题

essential_components 支持自定义主题,你可以通过 EssentialTheme 来统一设置组件的样式。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Essential Components Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: EssentialTheme(
        data: EssentialThemeData(
          buttonTheme: EssentialButtonThemeData(
            backgroundColor: Colors.blue,
            textColor: Colors.white,
          ),
        ),
        child: MyHomePage(),
      ),
    );
  }
}
回到顶部