Flutter多风味包管理插件flavored_packages的使用
Flutter多风味包管理插件flavored_packages的使用
关于
这是一个脚本工具,允许你根据不同的风味(flavor)注册不同的包实现。
如何工作
该工具基于Flutter提供的endorsed federated plugins结构。每个风味实现必须遵循/支持由接口包描述的合同(interface)。接口包必须提供一个pubspec.base.yaml
文件,其内容与普通的pubspec.yaml
相同,但工具会生成一个pubspec.yaml
文件,根据风味注册默认实现。
注意事项
- 应用程序的
pubspec.yaml
中列出的所有包都必须位于项目根目录下的packages
文件夹中。 - 主
pubspec.yaml
必须新增以下字段:
flavored_packages:
package1:
flavors:
flavor_name: package_with_impl
flavor_name: package_with_impl
flavor_name: package_with_impl
package2:
flavors:
flavor_name: package_with_impl
flavor_name: package_with_impl
flavor_name: package_with_impl
例如,运行命令dart pub global run flavored_packages -f free
会为每个包生成一个pubspec.yaml
文件。
更多示例可查看示例文件夹。
建议
- 你应该将每个接口包的
pubspec.yaml
添加到.gitignore
中,因为它每次运行CLI时都会生成新的文件。 - 你应该将应用程序的
pubspec.lock
添加到.gitignore
中,因为它会根据风味变化,这意味着在pubspec.yaml
中的依赖项应具有严格版本(即pubspec.yaml
中不应包含^
、>=
或<=
符号)。
dependencies:
a_package_for_my_app: 1.0.0 ✅
a_package_for_my_app: ^1.0.0 ❌
示例代码
以下是完整的示例代码,展示如何使用flavored_packages
插件。
文件结构
project_root/
├── packages/
│ ├── analytics_interface/
│ │ ├── lib/
│ │ │ └── interface.dart
│ │ ├── pubspec.base.yaml
│ │ └── pubspec.yaml
│ ├── analytics_free/
│ │ ├── lib/
│ │ │ └── free_implementation.dart
│ │ ├── pubspec.yaml
│ ├── analytics_premium/
│ │ ├── lib/
│ │ │ └── premium_implementation.dart
│ │ ├── pubspec.yaml
│ ├── app/
│ │ ├── lib/
│ │ │ └── main.dart
│ │ └── pubspec.yaml
└── README.md
示例代码解释
packages/analytics_interface/pubspec.base.yaml
name: analytics_interface
version: 1.0.0
packages/analytics_interface/lib/interface.dart
abstract class AnalyticsInterface {
Future<String> getPlatformVersion();
}
packages/analytics_free/lib/free_implementation.dart
import 'package:analytics_interface/interface.dart';
class FreeAnalytics implements AnalyticsInterface {
[@override](/user/override)
Future<String> getPlatformVersion() async {
return "Free Analytics Platform Version";
}
}
packages/analytics_premium/lib/premium_implementation.dart
import 'package:analytics_interface/interface.dart';
class PremiumAnalytics implements AnalyticsInterface {
[@override](/user/override)
Future<String> getPlatformVersion() async {
return "Premium Analytics Platform Version";
}
}
packages/app/pubspec.yaml
name: app
version: 1.0.0
environment:
sdk: ">=2.18.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
analytics_interface: 1.0.0
flavored_packages:
analytics:
flavors:
free: analytics_free
premium: analytics_premium
packages/app/lib/main.dart
import 'package:flutter/material.dart';
import 'package:analytics_interface/interface.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late final Future<String> _future;
[@override](/user/override)
void initState() {
super.initState();
_future = Analytics().getPlatformVersion();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: FutureBuilder<String>(
initialData: 'Fetching platform version..',
future: _future,
builder: (context, snapshot) {
return Text(snapshot.requireData);
},
),
),
);
}
}
更多关于Flutter多风味包管理插件flavored_packages的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
1 回复