Flutter常用组件集合插件essential_components的使用
Flutter常用组件集合插件essential_components的使用
en-US
essential_components
一个库,旨在简化Web应用程序开发人员使用AngularDart的工作。此库将实现几个关键组件,以加快AngularDart Web应用程序的开发。
组件画廊
开始使用
- 创建一个新的AngularDart应用:https://angulardart.dev/guide/setup
- 在
pubspect.yaml
中添加essential_components
依赖:dependencies: ... essential_components: any ...
- 在
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>
- 在你的组件中添加所需的
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的工作。
正在建设中
安装
- 在您的包管理器中的
pubspec.yaml
文件中添加依赖项。dependencies: essential_components: ^0.1.2
- 使用命令
pub get
安装。 - 要使用,只需在您的组件中导入实现:
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;
// 这将是字段的值。例如:nomeDataTableColumnType type;
//DataTableColumnType.text
。这些是存在于枚举中的类型。它们是:img, text, date, dateTimeString 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
更多关于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
还提供了许多其他组件,如 EssentialCheckbox
、EssentialRadio
、EssentialSwitch
等。你可以根据需要在项目中使用这些组件。
自定义主题
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(),
),
);
}
}