我们想要定义一个Flutter资产,该资产可以在同一插件内从Android平台代码访问。这方面的文件据称就在这里。
请注意,我们不是在谈论flutter应用程序中的自定义平台代码——我们是从插件作者的角度来谈论flutter插件代码。
因此,在文档之后,我们从插件的pubspec.yaml文件开始,该文件存在于[your_plugin_root_dir]\pubspec.yaml中,并添加了资产定义:
assets:
- assets/sound.wav
这指向[your_plugin_root_dir]\assets\sound.wav 中的现有文件
到目前为止一切都很好,但我们有一个问题:
当你在Android studio中创建一个新的Flutter插件项目时,该插件的Android Java文件如下所示:
public class PluginTestPlugin implements FlutterPlugin, MethodCallHandler {
/// The MethodChannel that will the communication between Flutter and native Android
///
/// This local reference serves to register the plugin with the Flutter Engine and unregister it
/// when the Flutter Engine is detached from the Activity
private MethodChannel channel;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "plugin_test");
channel.setMethodCallHandler(this);
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
}
为了从该代码中访问您的资产,文档建议添加以下代码:
AssetManager assetManager = registrar.context().getAssets();
String key = registrar.lookupKeyForAsset("assets/sound.wav");
AssetFileDescriptor fd = assetManager.openFd(key);
但由于没有";注册员";实例,而文档没有描述它是如何创建的,也没有描述如何访问它,我迷失了方向
我在这里错过了什么????
在方法通道旁边添加另一个字段,以保持绑定;
private MethodChannel channel;
private FlutterPluginBinding binding;
在onAttachedToEngine
中设置它:
channel.setMethodCallHandler(this);
binding = flutterPluginBinding;
并在onDetached
中清除
channel.setMethodCallHandler(null);
binding = null;
然后像这样使用它(为此,我向名为assets/foo.bin
的插件(而不是示例应用程序(添加了一个资产,我的插件名称是plugin1
(
String assetPath = binding
.getFlutterAssets()
.getAssetFilePathBySubpath("assets/foo.bin", "plugin1");
try {
InputStream is = binding.getApplicationContext().getAssets().open(assetPath);
// todo - read the asset into memory or whatever
is.close();
} catch (IOException e) {
Log.e("plugin1", e.getMessage());
}
插件项目的pubspec.yaml需要额外的行来打包资产,如下所示,在plugin
部分之后:
plugin:
platforms:
android:
package: io.swhh.plugin1
pluginClass: Plugin1Plugin
ios:
pluginClass: Plugin1Plugin
assets:
- assets/foo.bin
你可能对iOS中的同类产品感兴趣(请原谅缺乏错误处理(
let key = FlutterDartProject.lookupKey(forAsset: "assets/foo.bin", fromPackage: "plugin1")
let path = Bundle.main.path(forResource: key, ofType: nil, inDirectory: nil)
let url = URL(fileURLWithPath: path!)
// use url to load the resource