Flutter Odoo RPC通信插件flutter_odoo_rpc的使用
Flutter Odoo RPC通信插件flutter_odoo_rpc的使用
Odoo RPC客户端库
Odoo RPC客户端库用于Dart。
特性
- 使用之前存储的Odoo会话初始化客户端。
- 通过数据库名称、登录名和密码进行身份验证。
- 向JSON控制器发出JSON-RPC请求。
- 通过
CallKw
执行公共方法。 - 通过流获取Odoo会话更新。
- 终止会话(登出)。
- 捕获会话过期时的异常。
使用
要使用此插件,在您的pubspec.yaml
文件中添加flutter_odoo_rpc
作为依赖。例如:
dependencies:
flutter_odoo_rpc: ^0.4.5
示例
基本RPC调用
import 'dart:io';
import 'package:flutter_odoo_rpc/flutter_odoo_rpc.dart';
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('已安装模块: \n' + res.toString());
} on OdooException catch (e) {
print(e);
client.close();
exit(-1);
}
client.close();
}
带有跟踪会话变化的RPC调用
Odoo服务器将在每次调用时发出新的session_id
。
import 'dart:io';
import 'package:flutter_odoo_rpc/flutter_odoo_rpc.dart';
void sessionChanged(OdooSession sessionId) async {
print('我们得到了新的会话ID: ' + sessionId.id);
// 将会话ID存储到某种持久化存储中
}
void main() async {
// 从某种持久化存储中恢复会话
var prev_session = restore_session_somehow();
var client = OdooClient("https://my-db.odoo.com", prev_session);
// 订阅会话变化以存储最新的会话
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('已安装模块: \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('会话过期');
}
subscription.cancel();
client.close();
}
使用FutureBuilder
的Flutter示例
import 'package:flutter/material.dart';
import 'package:flutter_odoo_rpc/flutter_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](/user/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](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('联系人'),
),
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('无法获取数据');
return CircularProgressIndicator();
}
}),
),
);
}
}
更多关于Flutter Odoo RPC通信插件flutter_odoo_rpc的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Odoo RPC通信插件flutter_odoo_rpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_odoo_rpc
是一个用于在 Flutter 应用中与 Odoo 进行 RPC 通信的插件。它允许你通过 Odoo 的 XML-RPC 或 JSON-RPC API 与 Odoo 服务器进行交互,执行诸如登录、读取、写入、搜索等操作。
安装
首先,你需要在 pubspec.yaml
文件中添加 flutter_odoo_rpc
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_odoo_rpc: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
-
初始化
OdooClient
首先,你需要创建一个
OdooClient
实例,并指定 Odoo 服务器的 URL。import 'package:flutter_odoo_rpc/flutter_odoo_rpc.dart'; final odoo = OdooClient('https://your-odoo-server.com');
-
登录
使用
OdooClient
的login
方法进行登录。你需要提供数据库名称、用户名和密码。try { await odoo.login('your_database', 'your_username', 'your_password'); print('Login successful'); } catch (e) { print('Login failed: $e'); }
-
执行 RPC 调用
登录成功后,你可以使用
OdooClient
的call
方法执行 RPC 调用。例如,读取某个模型的记录:try { final records = await odoo.callKw({ 'model': 'res.partner', 'method': 'search_read', 'args': [], 'kwargs': { 'domain': [], 'fields': ['name', 'email'], 'limit': 10, }, }); print('Records: $records'); } catch (e) { print('Error: $e'); }
-
写入记录
你可以使用
write
方法来更新记录:try { await odoo.callKw({ 'model': 'res.partner', 'method': 'write', 'args': [[1], {'name': 'New Name'}], }); print('Record updated'); } catch (e) { print('Error: $e'); }
-
创建记录
使用
create
方法来创建新记录:try { final newId = await odoo.callKw({ 'model': 'res.partner', 'method': 'create', 'args': [{'name': 'New Partner', 'email': 'new@example.com'}], }); print('New record created with ID: $newId'); } catch (e) { print('Error: $e'); }
-
搜索记录
使用
search
方法来搜索记录:try { final recordIds = await odoo.callKw({ 'model': 'res.partner', 'method': 'search', 'args': [[['name', 'ilike', 'New Partner']]], }); print('Found records: $recordIds'); } catch (e) { print('Error: $e'); }
-
登出
使用
OdooClient
的logout
方法登出:await odoo.logout(); print('Logged out');
错误处理
在执行 RPC 调用时,可能会遇到各种错误,例如网络问题、认证失败、无效的模型或方法等。建议使用 try-catch
块来捕获并处理这些错误。
示例代码
以下是一个完整的示例,展示了如何使用 flutter_odoo_rpc
进行登录、读取记录和登出:
import 'package:flutter/material.dart';
import 'package:flutter_odoo_rpc/flutter_odoo_rpc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Odoo RPC Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
final odoo = OdooClient('https://your-odoo-server.com');
try {
await odoo.login('your_database', 'your_username', 'your_password');
print('Login successful');
final records = await odoo.callKw({
'model': 'res.partner',
'method': 'search_read',
'args': [],
'kwargs': {
'domain': [],
'fields': ['name', 'email'],
'limit': 10,
},
});
print('Records: $records');
await odoo.logout();
print('Logged out');
} catch (e) {
print('Error: $e');
}
},
child: Text('Connect to Odoo'),
),
),
),
);
}
}