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文件。

更多示例可查看示例文件夹。

建议

  1. 你应该将每个接口包的pubspec.yaml添加到.gitignore中,因为它每次运行CLI时都会生成新的文件。
  2. 你应该将应用程序的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 回复

更多关于Flutter多风味包管理插件flavored_packages的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flavored_packages 是一个用于管理 Flutter 多风味(Flavors)的插件,它允许你在不同的风味(如开发、生产、测试等)中使用不同的依赖包或配置。通过这个插件,你可以轻松地管理和切换不同风味下的依赖包,而无需手动修改 pubspec.yaml 文件。

安装 flavored_packages

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

dev_dependencies:
  flavored_packages: ^1.0.0

然后运行 flutter pub get 来安装插件。

配置多风味

  1. 创建风味配置文件

    在你的项目根目录下创建一个 flavors 文件夹,并在其中为每个风味创建一个配置文件。例如:

    flavors/
    ├── dev.yaml
    ├── prod.yaml
    └── staging.yaml
    
  2. 在配置文件中定义依赖

    在每个风味配置文件中,你可以定义不同的依赖包。例如,dev.yaml 文件可以包含以下内容:

    dependencies:
      dio: ^4.0.0
      flutter_bloc: ^7.0.0
    

    prod.yaml 文件可以包含:

    dependencies:
      dio: ^4.0.0
      flutter_bloc: ^7.0.0
      sentry: ^6.0.0
    
  3. pubspec.yaml 中引用风味配置

    pubspec.yaml 文件中,你可以使用 flavored_packages 插件来引用这些风味配置文件:

    flavored_packages:
      flavors:
        dev: flavors/dev.yaml
        prod: flavors/prod.yaml
        staging: flavors/staging.yaml
    
  4. 选择风味

    在运行或构建你的 Flutter 应用时,你可以通过命令行参数来选择使用的风味。例如:

    flutter run --flavor dev
    

    或者:

    flutter build apk --flavor prod
    

使用风味配置

在代码中,你可以通过 flavored_packages 插件提供的 API 来访问当前风味的配置。例如:

import 'package:flavored_packages/flavored_packages.dart';

void main() {
  final flavor = FlavoredPackages.currentFlavor;
  print('Current flavor: $flavor');

  if (flavor == 'dev') {
    // 开发环境特定的逻辑
  } else if (flavor == 'prod') {
    // 生产环境特定的逻辑
  }
}
回到顶部