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获取的模型都需要有自己的OdooRecord和OdooRepository实现对。
在实现了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
更多关于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);

