Flutter Odoo RPC调用插件odoo_rpc的使用

发布于 1周前 作者 nodeper 来自 Flutter

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

1 回复

更多关于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),
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml中添加odoo_rpc依赖。
  2. 初始化Odoo RPC客户端:在initState方法中,使用Odoo服务器的URL、数据库名、用户名和密码来初始化OdooRpc对象。
  3. 身份验证:调用_odooRpc.authenticate()方法进行身份验证,这将返回一个会话ID。
  4. RPC调用:使用获取到的会话ID调用Odoo模型的方法。在这个例子中,我们调用了res.users模型的read方法来获取当前用户的信息。
  5. 更新UI:将RPC调用的结果更新到UI上。

请注意,你需要将示例代码中的http://你的Odoo服务器地址:端口你的数据库名你的用户名你的密码替换为你实际的Odoo服务器信息。

这个示例展示了基本的Odoo RPC调用流程,你可以根据需要扩展和修改这个示例以适应你的具体需求。

回到顶部