Flutter服务通用功能插件pip_services4_commons的使用
Flutter服务通用功能插件pip_services4_commons的使用
此模块是Pip.Services多语言微服务工具包的一部分。它提供了在微服务或后端服务中使用的各种基本模式。该模块还实现了大多数支持语言的基本功能的合理薄抽象层,以促进对称实现。
模块包含以下包:
- Convert - 可移植的值转换器
- Data - 数据模式
- Errors - 应用程序错误
- Reflect - 可移植的反射实用程序
快速链接:
- 配置模式
- 定位模式
- 组件生命周期
- 具有主动逻辑的组件
- 数据模式
- API引用
- 更改日志
- 获取帮助
- 贡献
使用
在您的包的pubspec.yaml
文件中添加以下内容:
dependencies:
pip_services4_commons: version
开发
对于开发,您需要安装以下前提条件:
- Dart SDK 3
- Visual Studio Code 或其他您选择的IDE
- Docker
安装依赖项:
pub get
运行自动化测试:
pub run test
生成API文档:
./docgen.ps1
在提交更改之前,运行容器化的构建和测试:
./build.ps1
./test.ps1
./clear.ps1
联系方式
该库由Sergey Seroukhov、Levichev Dmitry和Alexey Dvoykin创建和维护。
文档由Egor Nuzhnykh、Alexey Dvoykin、Mark Makarychev和Levichev Dmitry编写。
示例
以下是一些使用pip_services4_commons的示例代码。
命令模式
var command = Command('name', null, CommandExec());
var map = {};
map[8] = 'title 8';
map[11] = 'title 11';
var param = Parameters(map);
var result = await command.execute('a', param); // 结果为 123
配置框架
var config = ConfigParams.fromTuples([
'Section1.Key1',
'Value1',
'Section1.Key2',
'Value2',
'Section1.Key3',
'Value3'
]);
config.get('Section1.Key1'); // 'Value1'
config.get('Section1.Key2'); // 'Value2'
config.get('Section1.Key3'); // 'Value3'
config.get('Section1.Key4'); // null
软值转换器
StringConverter.toNullableString(null); // null
StringConverter.toNullableString([1, 2, 3]); // '1,2,3'
StringConverter.toString2('xyz'); // 'xyz'
StringConverter.toString2(123); // '123'
StringConverter.toString2(true); // 'true'
数据模式
var array = AnyValueArray();
array = AnyValueArray([1, 2, 3]);
array = AnyValueArray.fromString('Fatal,Error,Info,', ',');
应用程序错误
ApplicationException _appEx;
Exception _ex;
var Category = 'category';
var CorrelationId = 'correlationId';
var Code = 'code';
var Message = 'message';
_ex = Exception('Cause exception');
_appEx = ApplicationException(Category, CorrelationId, Code, Message);
_appEx.withCause(_ex);
var newCorrelationId = 'newCorrelationId';
var appEx = _appEx.withCorrelationId(newCorrelationId);
随机数据生成器
var value = RandomInteger.nextInteger(5);
value = RandomInteger.nextInteger(2, 5);
//-------------------------------------------
var interval = RandomDuration.nextDuration(
Duration(milliseconds: 10000), Duration(milliseconds: 15000));
//-------------------------------------------
var value = RandomBoolean.chance(5, 10);
//-------------------------------------------
var array = [1, 2];
var value = RandomArray.pick<int>(array);
定位(IoC)模式
var descriptor =
Descriptor('pip-dummies', 'controller', 'default', 'default', '1.0');
var res = descriptor.toString(); // pip-dummies:controller:default:default:1.0
//-----------------------------------------------------------------------------
var ref1 = {'test': 'val1'};
var ref2 = {'temp': 'value'};
var refs = References.fromTuples([
'Reference1',
ref1,
Descriptor(
'pip-services-commons', 'reference', 'object', 'ref2', '1.0'),
ref2
]);
var resolver = DependencyResolver.fromTuples([
'ref1',
'Reference1',
'ref2',
Descriptor('pip-services-commons', 'reference', '*', '*', '*')
]);
resolver.setReferences(refs);
resolver.getOneRequired('ref1'); // ref1
resolver.getOneRequired('ref2'); // ref2
resolver.getOneOptional('ref3'); // null
反射框架
var obj = TestClass();
var value = ObjectReader.getProperty(obj, 'privateField'); // null
value = ObjectReader.getProperty(obj, 'publicField'); // 'ABC'
value = ObjectReader.getProperty(obj, 'PublicProp'); // 不为空
执行框架
// FixedRateTimer
class TestTimer implements INotifiable {
int counter = 0;
void notify(String? correlationId, Parameters args) {
counter++;
}
}
var notifier = TestTimer();
var timer = FixedRateTimer(notifier, 100, 0);
timer.start();
//-------------------------------------------------
// Parameters
var result = Parameters.fromTuples(['value1', 123, 'value2', 234]);
var defaults = Parameters.fromTuples(['value2', 432, 'value3', 345]);
result = result.setDefaults(defaults, false);
result['value1'] // 123
result['value2'] // 234
result['value3'] // 345
验证框架
class TestObject {
TestObject() {
mapProperty['Key1'] = 111;
mapProperty['Key2'] = 222;
}
int _privateField = 124;
String _privateProperty = 'XYZ';
int intField = 12345;
String stringProperty = 'ABC';
dynamic nullProperty;
List<int> intArrayProperty = [1, 2, 3];
List<String> stringListProperty = ['AAA', 'BBB'];
Map<String, int> mapProperty = {};
TestSubObject subObjectProperty = TestSubObject('1');
List<TestSubObject> subArrayProperty = [
TestSubObject('2'),
TestSubObject('3')
];
}
//------------------------------------------
var schema = ObjectSchema()
.withOptionalProperty('_privateField')
.withOptionalProperty('_privateProperty')
.withOptionalProperty('intField')
.withOptionalProperty('stringProperty')
.withOptionalProperty('nullProperty')
.withOptionalProperty('intArrayProperty')
.withOptionalProperty('stringListProperty')
.withOptionalProperty('mapProperty')
.withOptionalProperty('subObjectProperty')
.withOptionalProperty('subArrayProperty');
var obj = TestObject();
var results = schema.validate(obj); // results.length is 0, 所有规则良好
更多关于Flutter服务通用功能插件pip_services4_commons的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter服务通用功能插件pip_services4_commons的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter项目中,使用pip_services4_commons
这样的通用功能插件可以帮助你实现很多常见的服务操作,如配置管理、日志记录、错误处理等。虽然pip_services4_commons
并不是Flutter的原生库(Flutter社区中更多使用的是Dart编写的库),但假设存在一个类似的库或者我们自己封装一些通用功能,这里提供一些代码示例来展示如何在Flutter中实现这些通用功能。
1. 配置管理
首先,我们可以创建一个配置管理类来读取和管理配置信息。
import 'dart:convert';
import 'package:flutter/services.dart';
class ConfigManager {
static Map<String, dynamic> _config = {};
static Future<void> loadConfigFromAssets(String assetPath) async {
String jsonString = await rootBundle.loadString(assetPath);
_config = jsonDecode(jsonString) as Map<String, dynamic>;
}
static String get(String key, {String defaultValue}) {
return _config[key] ?? defaultValue ?? '';
}
static int getInt(String key, {int defaultValue}) {
return _config[key]?.toInt() ?? defaultValue ?? 0;
}
static bool getBool(String key, {bool defaultValue}) {
return _config[key]?.toBool() ?? defaultValue ?? false;
}
}
使用示例:
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await ConfigManager.loadConfigFromAssets('assets/config.json');
runApp(MyApp());
}
2. 日志记录
接下来,我们实现一个简单的日志记录器。
import 'dart:developer';
class Logger {
static void debug(String message) {
log(message, level: LogLevel.debug);
}
static void info(String message) {
log(message, level: LogLevel.info);
}
static void warning(String message) {
log(message, level: LogLevel.warn);
}
static void error(String message, {Object error, StackTrace stackTrace}) {
log(message, level: LogLevel.error, error: error, stackTrace: stackTrace);
}
}
使用示例:
void someFunction() {
Logger.info('This is an info message');
try {
// Some code that might throw an error
} catch (e, s) {
Logger.error('An error occurred', error: e, stackTrace: s);
}
}
3. 错误处理
在Flutter中,错误处理通常通过try-catch语句和错误边界(如ErrorWidget
)来实现。这里展示一个简单的错误处理示例。
void handleError(Function function) {
try {
function();
} catch (e, s) {
Logger.error('An unhandled error occurred', error: e, stackTrace: s);
// Optionally show a snackbar or dialog to the user
// ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('An error occurred')));
}
}
使用示例:
void someRiskyOperation() {
handleError(() {
// Risky code here
});
}
总结
虽然pip_services4_commons
可能不是直接为Flutter设计的,但通过上述代码示例,你可以看到如何在Flutter中实现配置管理、日志记录和错误处理等通用功能。这些功能对于构建健壮和可维护的Flutter应用至关重要。根据具体需求,你可以进一步扩展这些基础功能。