gpt4 book ai didi

flutter - 在 Flutter 中将开发与部署 Assets 分开

转载 作者:行者123 更新时间:2023-12-05 07:17:40 24 4
gpt4 key购买 nike

我在开发过程中使用了一些 Assets (伪造的 API 响应和随机图像),为此,我正在加载一些 Assets 。
显然我不希望这些 Assets 与发布的 APK 捆绑在一起,你是怎么做到的?

现在,我将所有 Assets 集中在一个pubspec.yaml .

最终目标是能够运行应用 flutter run并且有假后端。我知道模拟 HTTP 调用,但很难包装一个完整的应用程序,所以现在我有两个不同的数据源(一个来自 Assets ,另一个基于 http),我根据 kReleaseMode 调用一个。值(value)。

谢谢!

最佳答案

我有同样的问题(这似乎也是一个孤立的 flutter 问题),但是使用在 dart build_runner 中运行的 Builder 解决了它 - 不要混淆使用小部件的 flutter Builder 模式(这会破坏搜索结果)。其工作原理如下所示:

  • 在 Assets 之外的单独目录中收集开发资源(在我的例子中是 lib/devdata/)
  • 创建一个Builder 实现和一个build.yaml 文件
  • build.yaml 中创建单独的 dev_properties 允许构建器根据构建模式运行,即将文件复制到 assets/devdata/ 或删除 assets/devdata/ 和此目录到 .gitignore
  • assets/devdata/ 添加到 pubspec.yaml 中的 Assets 中
  • 在 dev 或 prod 模式下运行 build_runner 以复制或删除文件
  • 如果文件存在,则使用 rootBundle 使用应用程序中的文件/如果文件不存在,则捕获生成的异常

此命令分别在开发/ Release模式下调用 build_runner:

$ flutter pub run build_runner build
$ flutter pub run build_runner build --release

构建器大致如下所示(保存在 lib/devdata/devdata.dart 中):

import 'dart:async';
import 'dart:io';
import 'package:build/build.dart';

Builder devData(BuilderOptions options) => DevDataBuilder(options);

class DevDataBuilder implements Builder {
final BuilderOptions options;

DevDataBuilder(this.options);

@override
FutureOr<void> build(BuildStep buildStep) async {
var mode = options.config['mode'];
var inputId = buildStep.inputId;
var sourcePath = inputId.path;
var targetPath = sourcePath.replaceFirst('lib/devdata/', 'assets/devdata/');
final outputId = AssetId(
inputId.package,
targetPath,
);
if (mode == 'dev') {
log.info('copying $sourcePath to $targetPath');
var contents = await buildStep.readAsString(inputId);
await buildStep.writeAsString(outputId, contents);
} else {
var file = File(targetPath);
if (await file.exists()) {
log.info('deleting $targetPath');
file.delete();
}
}
}

@override
Map<String, List<String>> get buildExtensions {
return {
'lib/devdata/{{file}}.json': const ['assets/devdata/{{file}}.json'],
};
}
}

相应的build.yaml在这里:

builders:
test_data:
import: 'package:my_app_package/builder/devdata.dart'
builder_factories: ['devData']
build_extensions: {"lib/devdata/{{file}}.json": ["assets/testdata/{{file}}.json"]}
build_to: source
auto_apply: root_package
defaults:
generate_for:
include:
- lib/devdata/**

global_options:
my_app_package:test_data:
options:
mode: prod
dev_options:
mode: dev

这里有一些导致这种方法的额外资源:

可以在这里找到没有构建器的替代方法(使用上面提到的 pr #25487):

https://github.com/sestegra/flutter_assets_flavors

关于flutter - 在 Flutter 中将开发与部署 Assets 分开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58700470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com