Flutter服务通用功能插件pip_services4_commons的使用

Flutter服务通用功能插件pip_services4_commons的使用

Pip.Services Logo

此模块是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

1 回复

更多关于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应用至关重要。根据具体需求,你可以进一步扩展这些基础功能。

回到顶部