搜尋套件、儲存庫與 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 資料及工作流程互動的原生或網頁應用程式。

適用情境

  • 將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 項

原始碼儲存庫

使用此套件的專案

暫無相關資料。