有没有一种方法可以从原生代码访问Flutter资源?

3
我想在我的本地Android代码中使用Flutter资源中的主徽标 - 例如,用于显示通知。正如您所知,在Android中,您通常会像这样从drawable文件夹获取资源R.drawable.icon。但是我还需要将图标复制到Android drawable文件夹中。也许有一种方法可以从本地代码访问Flutter资源(即资产)?"最初的回答"

你有没有尝试过分析由flutter run / flutter build工具创建的.apk文件?你注意到它包含在根目录下的assets文件夹了吗? - undefined
4个回答

16

Flutter文档中有一个关于此的不错的章节。

对于Android(自1.22版本以来)给定资源“icons/heart.png”:

FlutterLoader loader = FlutterInjector.instance().flutterLoader();

String key = loader.getLookupKeyForAsset("icons/heart.png");

对于iOS(Swift):

let key = registrar.lookupKey(forAsset: "icons/heart.png");

let path = Bundle.main.path(forResource: key, ofType: nil)

对于iOS(Objective-C):

NSString* key = [registrar lookupKeyForAsset:@"icons/heart.png"];

NSString* path = [[NSBundle mainBundle] pathForResource:key ofType:nil];

对于早于Flutter 1.22版本的Android(已弃用):

AssetManager assetManager = registrar.context().getAssets();

String key = registrar.lookupKeyForAsset("icons/heart.png");

AssetFileDescriptor fd = assetManager.openFd(key);

但是,您将无法直接共享可绘制项到Flutter,并且主要图标是一个特殊情况,您也绝对无法与Flutter共享。Flutter不知道什么是“drawable”,而是以自己的跨平台方式处理资源。


如果我不在插件中而是在MainActivity中,该怎么办?https://stackoverflow.com/questions/65374762/how-to-access-flutter-assets-from-java - undefined
你如何将AssetFileDescriptor转换为Drawable或资源? - undefined
PluginRegistry.Registrar已被弃用。@SurajNair的回答包含了更新后的代码。 - undefined

7

新版本更新说明

针对Flutter 1.22及以上版本,FlutterLoader仅能通过FlutterInjector来访问。

import io.flutter.FlutterInjector;

 FlutterLoader loader = FlutterInjector.instance().flutterLoader();
 String key = loader.getLookupKeyForAsset("assets_file_name");

1
然后,如何将您的密钥转换为可绘制对象? - undefined
我正在进行的项目使用了一个已弃用的包,在final FlutterLoader flutterLoader = FlutterLoader.getInstance()这一行出现了错误,但是使用您提供的解决方案后问题得到了解决。谢谢! - undefined

2

您需要获取资产文件的相对路径。

以下是从Swift本地代码访问文件/图像路径的辅助方法。

func flutterAssetLottieFilePath(imageName : String) -> String {
        var flutterViewController = FlutterViewController()
        flutterViewController = UIWindow.init(frame: UIScreen.main.bounds).rootViewController as! FlutterViewController
        let key = flutterViewController.lookupKey(forAsset:"assets/images/\(imageName).png")
        let path = Bundle.main.path(forResource: key, ofType: nil)
        return path ?? ""
    }

1
截至我撰写本文时,文档已经过时。在我的Flutter版本1.17.1中,这是一个带有必要导入的kotlin android示例:
import android.content.Context
import io.flutter.embedding.engine.loader.FlutterLoader
import java.io.InputStream

val myAssetPath : Sting = "assets/my_asset"
val assetLookupKey =  FlutterLoader.getInstance().getLookupKeyForAsset(myAssetPath)
val inputStream: InputStream = applicationContext.assets.open(assetLookupKey)

// Read in the file from the InputStream... 

需要注意的是,从 getLookupKeyForAsset 方法返回的值通常是你的资源路径,在你的 pubspec.yaml 文件中加入了它,只需在前面加上 "flutter_assets/"。因此,在上面的示例中,它将返回 flutter_assets/assets/my_asset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接