搜索插件、代码仓与 APP 分类

插件详情v0.7.1

odoo_rpc

用于 Dart 的 Odoo RPC 客户端库,通过流跟踪会话更改。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
1630
喜欢数
73
Pub 分数
150

安装插件

flutter pub add odoo_rpc

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

odoo_rpc 包是一个 Dart 库,可使用 RPC(远程过程调用)实现与 Odoo ERP 系统的无缝通信。它支持通过流进行实时跟踪的会话管理,使开发者能够动态监控身份验证状态和会话变化。该包专为跨平台使用而设计,可在 Android、iOS、Web、macOS、Windows 和 Linux 上运行。该包简化了与 Odoo 后端服务的集成,非常适合用于构建与 Odoo 数据和工作流程交互的原生或 Web 应用程序。

适合场景

  • 将Flutter应用与Odoo ERP集成
  • 企业应用中的实时会话监控
  • 使用 Odoo 后端构建 CRM 或库存工具
  • 在Flutter应用和Odoo之间同步数据
  • 从移动客户端自动执行Odoo操作

主要特点

  • 基于流的会话更改跟踪
  • 跨平台兼容性
  • 与 Odoo 的安全 RPC 通信
  • 支持身份验证和会话持久化
  • 通过 Flutter pub add 命令轻松设置

适合对象

  • Flutter 开发人员构建集成 ERP 的应用程序
  • 使用Odoo作为后端的企业应用团队
  • 需要实时会话更新的开发人员
  • 需要Odoo连接的移动和桌面应用程序
  • 正在开发基于Odoo的企业解决方案的团队

使用建议

  • 需要一个启用了 RPC 的活跃 Odoo 服务器
  • 身份验证设置必须谨慎处理
  • 除了基本用法外,文档有限
  • 依赖稳定的网络连接到Odoo
  • 不适用于非Odoo后端集成

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Odoo RPC Client Library

Odoo RPC Client Library for Dart.

Features

  • Initialize client with previously stored Odoo Session.
  • Authenticate via database name, login and password.
  • Issue JSON-RPC requests to JSON controllers.
  • Execute public methods via CallKw.
  • Get Odoo Session updates via stream.
  • Terminate session (logout).
  • Catch exceptions when session expires.

Usage

To use this plugin, add odoo_rpc as a dependency in your pubspec.yaml file. For example:

dependencies:
  odoo_rpc: <latest_version>

Examples

Basic RPC-call

import 'dart:io';
import 'package:odoo_rpc/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('Installed modules: \n' + res.toString());
  } on OdooException catch (e) {
    print(e);
    client.close();
    exit(-1);
  }
  client.close();
}

RPC-Calls with tracking session changes. Odoo server will issue new session_id on each call.

import 'dart:io';
import 'package:odoo_rpc/odoo_rpc.dart'


sessionChanged(OdooSession sessionId) async {
  print('We got new session ID: ' + sessionId.id);
  store_session_somehow(sessionId);
}


main() async {
  var prev_session = restore_session_somehow();
  var client = OdooClient("https://my-db.odoo.com", sessionId: prev_session);

  // Subscribe to session changes to store most recent one
  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());

    // logout
    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 example using FutureBuilder.

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();
              }
            }),
      ),
    );
  }
}

For more complex usage consider odoo_repository as abstraction layer between your flutter app and Odoo backend.

Web platform notice

This package intentionally uses http package instead of dart:io so web platform could be supported. However RPC calls via web client (dart js) that is hosted on separate domain will not work due to CORS requests currently are not correctly handled by Odoo. See https://github.com/odoo/odoo/pull/37853 for the details.

To make it work from different host we must follow the rules of CORS. Make sure your odoo server has these CORS headers:

Access-Control-Allow-Methods: GET, OPTIONS, PUT, POST
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Origin: https://{YOUR_FLUTTER_APP_DOMAIN}
Access-Control-Allow-Credentials: true // This is super important

And for WebApp you must use BrowserClient or something similar. The withCredentials = true is crucial. It allows the httpClient to carry on cookies from Browser. On Web browser, it won't allow you to directly access set-cookie header. As it is a forbidden header: https://fetch.spec.whatwg.org/#forbidden-request-header But it will automatically add this cookie to the BrowserClient whenever you make rpc call to your odoo server once authenticated.

OdooClient(BASE_URL,
  sessionId: ODOO_SESSION,
  httpClient: BrowserClient()..withCredentials = true,
  isWebPlatform = true,
)

For Web always listen to loginStream stream in order to get if user logged in or logged out. As session_id will be unaccesible on Web platform.

Issues

Please file any issues, bugs or feature requests as an issue on our GitHub page.

Want to contribute

If you would like to contribute to the plugin (e.g. by improving the documentation, solving a bug or adding a cool new feature), please send us your pull request.

Author

Odoo RPC Client Library is developed by ERP Ukraine.

所属分类

依赖

依赖清单 2 项

源码仓库

使用此插件的项目

暂无相关数据。