Flutter Odoo RPC调用插件odoo_rpc的使用
Flutter Odoo RPC调用插件odoo_rpc的使用
Odoo RPC Client Library
Odoo RPC Client Library 是一个用于 Dart 的库,允许开发者通过 JSON-RPC 与 Odoo 进行交互。以下是该库的一些主要功能:
- 使用预先存储的 Odoo Session 初始化客户端。
- 通过数据库名、登录名和密码进行身份验证。
- 向 JSON 控制器发出 JSON-RPC 请求。
- 通过
CallKw
执行公共方法。 - 通过流获取 Odoo Session 更新。
- 终止会话(登出)。
- 捕获会话过期时的异常。
使用方法
要在项目中使用此插件,请在 pubspec.yaml
文件中添加 odoo_rpc
作为依赖项。例如:
dependencies:
odoo_rpc: ^0.4.5
示例代码
基本RPC调用
以下是一个基本的 RPC 调用示例,它连接到 Odoo 实例并获取已安装的模块列表:
import 'dart:io';
import 'package:odoo_rpc/odoo_rpc.dart';
void main() async {
final client = OdooClient('https://my-db.odoo.com');
try {
await client.authenticate('my-db', 'admin', 'admin');
final res = await client.callRPC('/web/session/modules', 'call', {});
print('Installed modules: \n' + res.toString());
} on OdooException catch (e) {
print(e);
client.close();
exit(-1);
}
client.close();
}
带有会话更改跟踪的RPC调用
以下示例展示了如何处理会话更改,并在每次调用时从 Odoo 服务器获取新的 session_id
:
import 'dart:io';
import 'package:odoo_rpc/odoo_rpc.dart';
void sessionChanged(OdooSession sessionId) async {
print('We got new session ID: ' + sessionId.id);
// 将会话ID存储到持久化存储中
}
void main() async {
var prev_session = restore_session_somehow();
var client = OdooClient("https://my-db.odoo.com", prev_session);
// 订阅会话更改以存储最新的会话ID
var subscription = client.sessionStream.listen(sessionChanged);
try {
final session = await client.authenticate('my-db', 'admin', 'admin');
var res = await client.callRPC('/web/session/modules', 'call', {});
print('Installed modules: \n' + res.toString());
// 登出
await client.destroySession();
} on OdooException catch (e) {
print(e);
subscription.cancel();
client.close();
exit(-1);
}
try {
await client.checkSession();
} on OdooSessionExpiredException {
print('Session expired');
}
subscription.cancel();
client.close();
}
Flutter 示例:使用 FutureBuilder 获取联系人信息
以下是一个完整的 Flutter 示例,它使用 FutureBuilder
来获取并显示 Odoo 中的联系人信息:
import 'package:flutter/material.dart';
import 'package:odoo_rpc/odoo_rpc.dart';
final orpc = OdooClient('https://my-odoo-instance.com');
void main() async {
await orpc.authenticate('odoo-db', 'admin', 'admin');
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
Future<dynamic> fetchContacts() {
return orpc.callKw({
'model': 'res.partner',
'method': 'search_read',
'args': [],
'kwargs': {
'context': {'bin_size': true},
'domain': [],
'fields': ['id', 'name', 'email', '__last_update', 'image_128'],
'limit': 80,
},
});
}
Widget buildListItem(Map<String, dynamic> record) {
var unique = record['__last_update'] as String;
unique = unique.replaceAll(RegExp(r'[^0-9]'), '');
final avatarUrl =
'${orpc.baseURL}/web/image?model=res.partner&field=image_128&id=${record["id"]}&unique=$unique';
return ListTile(
leading: CircleAvatar(backgroundImage: NetworkImage(avatarUrl)),
title: Text(record['name']),
subtitle: Text(record['email'] is String ? record['email'] : ''),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Contacts'),
),
body: Center(
child: FutureBuilder(
future: fetchContacts(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
final record = snapshot.data[index] as Map<String, dynamic>;
return buildListItem(record);
});
} else {
if (snapshot.hasError) return Text('Unable to fetch data');
return CircularProgressIndicator();
}
}),
),
);
}
}
注意事项
-
Web平台支持:此包有意使用
http
包而不是dart:io
,以便支持 Web 平台。但是,由于 CORS 请求当前未被 Odoo 正确处理,因此托管在不同域上的 Web 客户端(Dart JS)的 RPC 调用将无法工作。详情请参见 Odoo GitHub Pull Request。 -
问题反馈:如果您遇到任何问题、错误或有功能请求,请在我们的 GitHub 页面上提交。
-
贡献:如果您想为插件做出贡献(例如改进文档、解决错误或添加新功能),请发送 Pull Request。
-
作者:Odoo RPC Client Library 由 ERP Ukraine 开发。
希望这些信息对您有所帮助!如果您有任何其他问题或需要进一步的帮助,请随时提问。
更多关于Flutter Odoo RPC调用插件odoo_rpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Odoo RPC调用插件odoo_rpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter中使用odoo_rpc
插件进行Odoo RPC调用的示例代码。这个示例展示了如何设置Odoo RPC客户端,以及如何进行身份验证和执行一些基本的RPC调用。
首先,确保你已经在pubspec.yaml
文件中添加了odoo_rpc
依赖:
dependencies:
flutter:
sdk: flutter
odoo_rpc: ^最新版本号 # 请替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
接下来,下面是一个完整的Flutter应用程序示例,它展示了如何使用odoo_rpc
插件:
import 'package:flutter/material.dart';
import 'package:odoo_rpc/odoo_rpc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
OdooRpc _odooRpc;
String _result = '';
@override
void initState() {
super.initState();
// 初始化Odoo RPC客户端
_odooRpc = OdooRpc(
baseUrl: 'http://你的Odoo服务器地址:端口',
db: '你的数据库名',
username: '你的用户名',
password: '你的密码',
);
// 进行身份验证并调用RPC方法
_authenticateAndCallRpc();
}
Future<void> _authenticateAndCallRpc() async {
try {
// 进行身份验证,获取会话ID
var sessionId = await _odooRpc.authenticate();
print('Session ID: $sessionId');
// 调用RPC方法,例如获取用户信息
var userModel = _odooRpc.getModel('res.users');
var userInfo = await userModel.callKw('read', [sessionId, []], {
'fields': ['name', 'email'],
});
// 更新UI
setState(() {
_result = 'User Info: ${userInfo[0]['name']} (${userInfo[0]['email']})';
});
} catch (e) {
print('Error: $e');
setState(() {
_result = 'Error: $e';
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Odoo RPC 调用示例'),
),
body: Center(
child: Text(_result),
),
),
);
}
}
解释
- 依赖添加:在
pubspec.yaml
中添加odoo_rpc
依赖。 - 初始化Odoo RPC客户端:在
initState
方法中,使用Odoo服务器的URL、数据库名、用户名和密码来初始化OdooRpc
对象。 - 身份验证:调用
_odooRpc.authenticate()
方法进行身份验证,这将返回一个会话ID。 - RPC调用:使用获取到的会话ID调用Odoo模型的方法。在这个例子中,我们调用了
res.users
模型的read
方法来获取当前用户的信息。 - 更新UI:将RPC调用的结果更新到UI上。
请注意,你需要将示例代码中的http://你的Odoo服务器地址:端口
、你的数据库名
、你的用户名
和你的密码
替换为你实际的Odoo服务器信息。
这个示例展示了基本的Odoo RPC调用流程,你可以根据需要扩展和修改这个示例以适应你的具体需求。