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

1 回复

更多关于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 来安装依赖。

基本用法

  1. 初始化 OdooClient

    首先,你需要创建一个 OdooClient 实例,并指定 Odoo 服务器的 URL。

    import 'package:flutter_odoo_rpc/flutter_odoo_rpc.dart';
    
    final odoo = OdooClient('https://your-odoo-server.com');
    
  2. 登录

    使用 OdooClientlogin 方法进行登录。你需要提供数据库名称、用户名和密码。

    try {
      await odoo.login('your_database', 'your_username', 'your_password');
      print('Login successful');
    } catch (e) {
      print('Login failed: $e');
    }
    
  3. 执行 RPC 调用

    登录成功后,你可以使用 OdooClientcall 方法执行 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');
    }
    
  4. 写入记录

    你可以使用 write 方法来更新记录:

    try {
      await odoo.callKw({
        'model': 'res.partner',
        'method': 'write',
        'args': [[1], {'name': 'New Name'}],
      });
      print('Record updated');
    } catch (e) {
      print('Error: $e');
    }
    
  5. 创建记录

    使用 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');
    }
    
  6. 搜索记录

    使用 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');
    }
    
  7. 登出

    使用 OdooClientlogout 方法登出:

    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'),
          ),
        ),
      ),
    );
  }
}
回到顶部