Flutter Odoo数据交互插件manex_odoo_repository的使用

Flutter Odoo数据交互插件manex_odoo_repository的使用

Odoo Models Repository

抽象层以与Odoo后端进行通信。
它帮助实现Odoo和Dart客户端之间的数据通信,并支持持久化和离线模式。

特性

  • 静态类型:Odoo记录由Dart类型表示。
  • 离线模式:记录存储在本地缓存中。
  • 调用队列:RPC调用在网络恢复在线时执行。
  • 记录流:轻松集成BLoC或FutureBuilder的数据更新。

描述

Odoo Repository包使用OdooRecord作为基类来表示从远程Odoo实例获取的记录。
该记录具有以下属性:

  • 包含用于存储数据的字段;
  • 是不可变的;
  • 可以与其他相同类型的记录进行比较以检查相等性;
  • 可以从JSON转换为对象或反之亦然。

基本的res.partner记录实现如下:

import 'package:equatable/equatable.dart';
import 'package:odoo_repository/odoo_repository.dart';

class Partner extends Equatable implements OdooRecord {
  const Partner(this.id, this.name);

  [@override](/user/override)
  final int id;
  final String name;

  /// 将Partner转换为JSON
  [@override](/user/override)
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
    };
  }

  /// 从JSON创建[Partner]
  static Partner fromJson(Map<String, dynamic> json) {
    return Partner(
      json['id'] as int,
      json['name'] as String,
    );
  }

  /// Equatable相关的比较逻辑
  [@override](/user/override)
  List<Object> get props => [id, name];

  /// 需要从Odoo获取的字段列表
  static List<String> get oFields => ['id', 'name'];

  [@override](/user/override)
  String toString() => 'User[$id]: $name';
}

每个需要从Odoo获取的模型都需要有自己的OdooRecordOdooRepository实现对。

在实现了Partner类之后,我们可以定义基于OdooRepository并配置了Partner类型的PartnerRepository类。

为了使PartnerRepository类能够提供Partner记录,只需要很少的配置即可。

import 'package:odoo_repository/odoo_repository.dart';
import 'package:odoo_rpc/odoo_rpc.dart';
import 'partner_record.dart';

class PartnerRepository extends OdooRepository<Partner> {
  [@override](/user/override)
  final String modelName = 'res.partner';

  PartnerRepository(OdooDatabase database) : super(database);

  [@override](/user/override)
  Partner createRecordFromJson(Map<String, dynamic> json) {
    return Partner.fromJson(json);
  }
}

首先我们需要实例化OdooEnvironment,它包含一组Odoo仓库并在添加到环境中的顺序相同地执行调用队列。

OdooEnvironment需要OdooClient、数据库名称、缓存和网络连接。当实例化时,可以通过add()调用添加新的仓库实例。

// 使用Hive初始化缓存存储
final cache = OdooKvHive();
await cache.init();
// 尝试从存储中恢复会话
OdooSession? session = cache.get('cacheSessionKey', defaultValue: null);
const odooServerURL = 'https://my-odoo-instance.com';
final odooClient = OdooClient(odooServerURL, session);
final netConn = NetworkConnectivity();
const odooDbName = 'odoo';

final env = OdooEnvironment(odooClient, odooDbName, cache, netConn);

final partnerRepo = env.add(PartnerRepository(env));
env.add(UserRepository(env));
env.add(SaleOrderRepository(env));
env.add(SaleOrderLineRepository(env));
// 等等...
// 后面我们可以通过以下方式访问PartnerRepository实例
final saleOrderRepo = env.of<SaleOrderRepository>();
final saleOrderLineRepo = saleOrderRepo.env.of<SaleOrderLineRepository>();

以下是使用connectivity包实现NetConnState的一个示例。

import 'package:connectivity/connectivity.dart';
import 'package:odoo_repository/odoo_repository.dart' show netConnState, NetConnState;

class NetworkConnectivity implements NetConnState {
  static NetworkConnectivity? _singleton;
  static late Connectivity _connectivity;

  factory NetworkConnectivity() {
    _singleton ??= NetworkConnectivity._();
    return _singleton!;
  }

  NetworkConnectivity._() {
    _connectivity = Connectivity();
  }

  [@override](/user/override)
  Future<netConnState> checkNetConn() async {
    final connectivityResult = await (_connectivity.checkConnectivity());
    if (connectivityResult == ConnectivityResult.mobile) {
      return netConnState.online;
    } else if (connectivityResult == ConnectivityResult.wifi) {
      return netConnState.online;
    }
    return netConnState.offline;
  }

  [@override](/user/override)
  Stream<netConnState> get onNetConnChanged async* {
    await for (var netState in _connectivity.onConnectivityChanged) {
      if (netState == ConnectivityResult.mobile) {
        // 网络现在在线
        yield netConnState.online;
      } else if (netState == ConnectivityResult.wifi) {
        // 网络现在在线
        yield netConnState.online;
      } else if (netState == ConnectivityResult.none) {
        // 网络现在离线
        yield netConnState.offline;
      }
    }
  }
}

更多关于Flutter Odoo数据交互插件manex_odoo_repository的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Odoo数据交互插件manex_odoo_repository的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


manex_odoo_repository 是一个用于在 Flutter 应用中与 Odoo 进行数据交互的插件。它提供了一种简单的方式来执行常见的 Odoo 操作,如读取、创建、更新和删除记录。以下是如何使用这个插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  manex_odoo_repository: ^latest_version

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

2. 初始化 Odoo 客户端

在你的 Flutter 应用中,首先需要初始化 Odoo 客户端。你可以通过以下方式创建一个 Odoo 客户端实例:

import 'package:manex_odoo_repository/manex_odoo_repository.dart';

void main() async {
  final odooClient = OdooClient(
    baseUrl: 'https://your-odoo-instance.com', // 你的 Odoo 实例的基 URL
    dbName: 'your_database_name', // 你的数据库名称
  );

  // 登录到 Odoo
  final authResponse = await odooClient.authenticate(
    login: 'your_username',
    password: 'your_password',
  );

  if (authResponse.isSuccess) {
    print('登录成功');
  } else {
    print('登录失败: ${authResponse.errorMessage}');
  }
}

3. 执行常见操作

读取记录

你可以使用 searchRead 方法来读取记录:

final records = await odooClient.searchRead(
  model: 'res.partner', // 模型名称
  domain: [], // 查询条件
  fields: ['name', 'email'], // 要读取的字段
);

print(records);

创建记录

你可以使用 create 方法来创建新记录:

final newRecordId = await odooClient.create(
  model: 'res.partner',
  values: {
    'name': 'New Partner',
    'email': 'new.partner@example.com',
  },
);

print('新记录的 ID: $newRecordId');

更新记录

你可以使用 write 方法来更新现有记录:

final isUpdated = await odooClient.write(
  model: 'res.partner',
  id: 1, // 要更新的记录 ID
  values: {
    'name': 'Updated Partner Name',
  },
);

print('记录更新成功: $isUpdated');

删除记录

你可以使用 unlink 方法来删除记录:

final isDeleted = await odooClient.unlink(
  model: 'res.partner',
  id: 1, // 要删除的记录 ID
);

print('记录删除成功: $isDeleted');

4. 处理错误

在执行 Odoo 操作时,可能会遇到错误。你可以通过检查方法的返回值或捕获异常来处理错误:

try {
  final records = await odooClient.searchRead(
    model: 'res.partner',
    domain: [],
    fields: ['name', 'email'],
  );
  print(records);
} catch (e) {
  print('发生错误: $e');
}

5. 注销

当你完成操作后,可以注销当前会话:

await odooClient.logout();

6. 使用 Repository 模式

manex_odoo_repository 还支持 Repository 模式,你可以为每个模型创建一个 Repository 类来封装数据访问逻辑:

class PartnerRepository {
  final OdooClient _odooClient;

  PartnerRepository(this._odooClient);

  Future<List<dynamic>> getPartners() async {
    return await _odooClient.searchRead(
      model: 'res.partner',
      domain: [],
      fields: ['name', 'email'],
    );
  }
}

然后在你的应用中使用这个 Repository:

final partnerRepository = PartnerRepository(odooClient);
final partners = await partnerRepository.getPartners();
print(partners);
回到顶部