Flutter核心功能扩展插件growerp_core的使用

Flutter核心功能扩展插件growerp_core的使用

这是GrowERP前端的核心包。它可以在一个Flutter应用程序中被调用,例如在示例目录中的管理应用。

它提供了系统的核心功能:

  • 初始化REST接口
  • 访问安全性
  • 多公司访问
  • 公司创建和维护
  • 用户维护
  • 任务维护
  • 目录/库存/用户/公司块

一个完整的管理系统的实现可以在admin应用中找到。

集成测试

示例组件中有一个可用的集成测试。

你可以使用本地后端系统进行测试。

你也可以使用我们的测试后端系统,设置在example/assets/cfg/app_settings.json中:

"databaseUrlDebug": "https://backend.growerp.org",
"chatUrlDebug": "wss://chat.growerp.org"

启动测试步骤如下(确保已经全局安装了melos):

melos build_all
melos l10n
cd example
flutter test integration_test

使用示例组件

与集成测试一样,你可以选择使用本地后端或我们的测试后端。

在使用核心组件之前,你需要创建一个公司,该公司的电子邮件会发送一个包含密码的邮件。使用此密码登录,然后核心组件将在主菜单中出现。

示例代码

以下是一个完整的示例代码,展示了如何使用growerp_core插件。

/*
 * 这个GrowERP软件属于公共领域,遵循CC0 1.0通用许可协议。
 * 
 * 尽管可能在法律允许的最大范围内,作者已将所有版权及相关权利
 * 以及相邻的权利转让给此软件到全球公共领域。此软件以无任何保证的方式分发。
 * 
 * 您应该已经收到一份CC0公共领域奉献书。如果没有,请参阅
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

// 忽略对引用包的依赖
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:growerp_core/growerp_core.dart';
import 'package:growerp_models/growerp_models.dart';
import 'package:hive_flutter/hive_flutter.dart';

Future<void> main() async {
  // 确保Flutter绑定初始化
  WidgetsFlutterBinding.ensureInitialized();
  
  // 加载配置文件
  await GlobalConfiguration().loadFromAsset('app_settings');

  // 初始化Hive数据库
  await Hive.initFlutter();
  
  // 设置Bloc观察者
  Bloc.observer = AppBlocObserver();
  
  // 创建REST客户端
  RestClient restClient = RestClient(await buildDioClient());
  
  // 创建聊天服务器实例
  ChatServer chatServer = ChatServer();

  // 运行应用
  runApp(TopApp(
    restClient: restClient,
    classificationId: 'AppAdmin',
    chatServer: chatServer,
    title: 'GrowERP package: growerp_core.',
    router: generateRoute,
    menuOptions: menuOptions,
    extraBlocProviders:
        getCoreBlocProviders(restClient, chatServer, 'AppAdmin', {}, null),
  ));
}

// 菜单定义
List<MenuOption> menuOptions = [
  MenuOption(
    image: 'packages/growerp_core/images/dashBoardGrey.png',
    selectedImage: 'packages/growerp_core/images/dashBoard.png',
    title: '主页',
    route: '/',
    userGroups: [UserGroup.admin, UserGroup.employee],
    child: const MainMenu(),
  ),
  MenuOption(
    image: 'packages/growerp_core/images/companyGrey.png',
    selectedImage: 'packages/growerp_core/images/company.png',
    title: '组织',
    route: '/company',
    userGroups: [UserGroup.admin, UserGroup.employee],
    child: const MainMenu(),
  ),
  MenuOption(
    image: 'packages/growerp_core/images/dashBoardGrey.png',
    selectedImage: 'packages/growerp_core/images/dashBoard.png',
    title: '已登录用户',
    route: '/user',
    userGroups: [UserGroup.admin, UserGroup.employee],
    child: const MainMenu(),
  ),
];

// 路由
Route<dynamic> generateRoute(RouteSettings settings) {
  if (kDebugMode) {
    debugPrint('>>NavigateTo { ${settings.name} '
        'with: ${settings.arguments.toString()} }');
  }
  switch (settings.name) {
    case '/':
      return MaterialPageRoute(
          builder: (context) => HomeForm(menuOptions: menuOptions));
    case '/company':
      return MaterialPageRoute(
          builder: (context) => HomeForm(menuOptions: menuOptions));
    case '/user':
      return MaterialPageRoute(
          builder: (context) => HomeForm(menuOptions: menuOptions));
    default:
      return coreRoute(settings);
  }
}

// 主菜单
class MainMenu extends StatelessWidget {
  const MainMenu({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return BlocBuilder<AuthBloc, AuthState>(builder: (context, state) {
      if (state.status == AuthStatus.authenticated) {
        Authenticate authenticate = state.authenticate!;
        return DashBoardForm(dashboardItems: [
          makeDashboardItem('dbCompany', context, menuOptions[1], [
            authenticate.company!.name!.length > 20
                ? "${authenticate.company!.name!.substring(0, 20)}..."
                : "${authenticate.company!.name}",
            "Email: ${authenticate.company!.email}",
            "货币: ${authenticate.company!.currency!.description}",
            "员工数量: ${authenticate.company!.employees.length}",
          ]),
          makeDashboardItem('dbUser', context, menuOptions[2], [
            "${authenticate.user!.firstName!} ${authenticate.user!.lastName!}",
            "Email: ${authenticate.user!.email}",
            "登录名:",
            " ${authenticate.user!.loginName}",
            "安全组: ${authenticate.user!.userGroup!.name}"
          ]),
        ]);
      }
      return const LoadingIndicator();
    });
  }
}

更多关于Flutter核心功能扩展插件growerp_core的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter核心功能扩展插件growerp_core的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用growerp_core插件的示例代码。请注意,由于growerp_core可能是一个特定业务或公司内部使用的插件,并非一个广泛知名的开源库,以下代码仅作为假设性的示例,旨在展示如何在Flutter项目中集成和使用一个核心功能扩展插件。

首先,确保你已经在pubspec.yaml文件中添加了growerp_core插件的依赖项(假设该插件已发布到pub.dev或者你可以通过其他方式获取它):

dependencies:
  flutter:
    sdk: flutter
  growerp_core: ^x.y.z  # 替换为实际的版本号

然后,运行flutter pub get来获取依赖项。

接下来,在你的Flutter项目中,你可以按照以下方式使用growerp_core插件:

import 'package:flutter/material.dart';
import 'package:growerp_core/growerp_core.dart';  // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Growerp Core Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String coreData = '';

  @override
  void initState() {
    super.initState();
    // 假设growerp_core有一个初始化函数
    GrowerpCore.initialize().then((_) {
      // 获取一些核心数据(这里只是一个假设的API调用)
      GrowerpCore.getCoreData().then((data) {
        setState(() {
          coreData = data;
        });
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Growerp Core Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Core Data:',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 10),
            Text(
              coreData,
              style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 假设growerp_core有一个执行核心功能的函数
          GrowerpCore.executeCoreFunction().then((result) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text('Core Function Executed: $result')),
            );
          });
        },
        tooltip: 'Execute Core Function',
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先在pubspec.yaml文件中添加了growerp_core依赖项。
  2. MyApp应用中,我们创建了一个简单的MaterialApp
  3. MyHomePage中,我们定义了一个状态变量coreData来存储从growerp_core插件获取的数据。
  4. initState方法中,我们调用GrowerpCore.initialize()来初始化插件(这只是一个假设的初始化方法),然后通过GrowerpCore.getCoreData()获取核心数据并更新UI。
  5. 我们还添加了一个浮动操作按钮(FAB),当用户点击它时,会调用GrowerpCore.executeCoreFunction()来执行一个核心功能,并通过SnackBar显示结果。

请注意,由于growerp_core是一个假设的插件,实际的API调用和方法可能与此示例不同。你需要参考该插件的官方文档或源代码来了解其具体的用法和API。

回到顶部