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
更多关于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),
),
);
}
}
在这个示例中:
- 我们首先在
pubspec.yaml
文件中添加了growerp_core
依赖项。 - 在
MyApp
应用中,我们创建了一个简单的MaterialApp
。 - 在
MyHomePage
中,我们定义了一个状态变量coreData
来存储从growerp_core
插件获取的数据。 - 在
initState
方法中,我们调用GrowerpCore.initialize()
来初始化插件(这只是一个假设的初始化方法),然后通过GrowerpCore.getCoreData()
获取核心数据并更新UI。 - 我们还添加了一个浮动操作按钮(FAB),当用户点击它时,会调用
GrowerpCore.executeCoreFunction()
来执行一个核心功能,并通过SnackBar显示结果。
请注意,由于growerp_core
是一个假设的插件,实际的API调用和方法可能与此示例不同。你需要参考该插件的官方文档或源代码来了解其具体的用法和API。