Flutter Odoo集成插件odoo_provider的使用

Flutter Odoo集成插件odoo_provider的使用

本文将描述如何创建一个Odoo Provider来对模型执行数据库操作(如插入、更新、删除等)。

该插件依赖于 odoo 包。

使用方法

1. 创建一个实现 IOdooModel 的类

class User implements IOdooModel {
  final int? id; // 假
  final String? login; // 假
  final String? name; // 假

  User({this.id, this.login, this.name});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);

  @override
  User fromJson(Map<String, dynamic> json) {
    return User.fromJson(json);
  }

  @override
  int? getId() {
    return this.id;
  }

  @override
  String getTableName() => "res.users";

  @override
  Map<String, dynamic> toJsonWithReduce(bool Function(MapEntry<String, dynamic> p1) validate) {
    Map<String, dynamic> fields = this.toJson();
    Map<String, dynamic> tmp = {};
    for (final field in fields.entries) {
      if (validate(field) == false) {
        continue;
      }

      tmp.putIfAbsent(field.key, () => field.value);
    }
    return tmp;
  }

  @override
  Map<String, dynamic> toJsonWithoutNullAndId() {
    return toJsonWithReduce((MapEntry entry) {
      if (entry.value == null || entry.key == 'id') {
        return false;
      }
      return true;
    });
  }

  @override
  List<String> getColumns() {
    List<String> resp = [];
    final tmp = this.toJson();
    for (final entry in tmp.keys) {
      resp.add(entry);
    }
    return resp;
  }
}

User _$UserFromJson(Map<String, dynamic> json) {
  return User(
      id: json['id'] as int,
      login: json['login'] as String,
      name: json['name'] as String);
}

Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
      'id': instance.id,
      'login': instance.login,
      'name': instance.name
    };

如果实现 IOdooModel 类的过程太繁琐,可以考虑使用 odoo_provider_builder 包来简化。

2. 将你的类分配给 OdooProvider

final odoo = Odoo(
  Connection(url: Url(Protocol.http, "localhost", 8069), db: 'odoo'),
);
await odoo.connect(Credential("admin", "admin"));

final userProvider = OdooProvider(adapter: odoo, model: User());

// 插入数据
await userProvider.insert(User(login: "test2222", name: "test"));

// 更新数据
await userProvider.update(User(id: 1, login: "updatedTest", name: "updatedName"));

// 删除数据
await userProvider.delete(User(id: 1));

// 查询数据
final users = await userProvider.search([["login", "=", "test2222"]]);

更多关于Flutter Odoo集成插件odoo_provider的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Odoo集成插件odoo_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


odoo_provider 是一个用于 Flutter 应用与 Odoo (之前称为 OpenERP) 集成的插件。它允许你在 Flutter 应用中轻松地与 Odoo 后端进行交互,执行常见的 CRUD 操作,并处理 Odoo 的认证和会话管理。

以下是使用 odoo_provider 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 odoo_provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  odoo_provider: ^0.0.1  # 请确保使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 初始化 Odoo 客户端

在你的 Flutter 应用中,首先需要初始化 Odoo 客户端。通常,你可以在 main.dart 文件中的 main 函数中完成这个操作。

import 'package:flutter/material.dart';
import 'package:odoo_provider/odoo_provider.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 Odoo 客户端
  final odooClient = OdooClient(baseUrl: 'https://your-odoo-instance.com');

  runApp(MyApp(odooClient: odooClient));
}

class MyApp extends StatelessWidget {
  final OdooClient odooClient;

  MyApp({required this.odooClient});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Odoo Flutter App',
      home: OdooProvider(
        odooClient: odooClient,
        child: MyHomePage(),
      ),
    );
  }
}

3. 使用 OdooProvider 访问 Odoo 客户端

在你的页面或 Widget 中,你可以使用 OdooProvider.of(context) 来获取 OdooClient 实例,并使用它来执行各种操作。

import 'package:flutter/material.dart';
import 'package:odoo_provider/odoo_provider.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final odooClient = OdooProvider.of(context).odooClient;

    return Scaffold(
      appBar: AppBar(
        title: Text('Odoo Integration'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            // 登录到 Odoo
            final loggedIn = await odooClient.login(
              database: 'your_database',
              login: 'your_username',
              password: 'your_password',
            );

            if (loggedIn) {
              print('Logged in successfully!');

              // 读取数据
              final records = await odooClient.searchRead(
                model: 'res.partner',
                domain: [],
                fields: ['id', 'name'],
              );

              print('Records: $records');
            } else {
              print('Login failed!');
            }
          },
          child: Text('Login and Fetch Data'),
        ),
      ),
    );
  }
}

4. 执行 CRUD 操作

使用 OdooClient 实例,你可以执行各种 CRUD 操作。以下是一些常见的操作示例:

  • 查询数据:

    final records = await odooClient.searchRead(
      model: 'res.partner',
      domain: [],
      fields: ['id', 'name'],
    );
    
  • 创建数据:

    final newRecordId = await odooClient.create(
      model: 'res.partner',
      values: {
        'name': 'New Partner',
        'email': 'partner@example.com',
      },
    );
    
  • 更新数据:

    final updated = await odooClient.write(
      model: 'res.partner',
      id: newRecordId,
      values: {
        'name': 'Updated Partner',
      },
    );
    
  • 删除数据:

    final deleted = await odooClient.unlink(
      model: 'res.partner',
      id: newRecordId,
    );
    

5. 处理会话和认证

odoo_provider 插件会自动处理会话管理和认证。你可以使用 login 方法进行登录,使用 logout 方法进行注销。

final loggedIn = await odooClient.login(
  database: 'your_database',
  login: 'your_username',
  password: 'your_password',
);

if (loggedIn) {
  print('Logged in successfully!');
} else {
  print('Login failed!');
}

// 注销
await odooClient.logout();

6. 错误处理

在使用 odoo_provider 进行 Odoo 集成时,确保处理可能的错误。例如,网络错误、认证失败或 Odoo 后端返回的错误。

try {
  final records = await odooClient.searchRead(
    model: 'res.partner',
    domain: [],
    fields: ['id', 'name'],
  );
  print('Records: $records');
} catch (e) {
  print('Error: $e');
}
回到顶部