Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有没有办法从本机代码访问Flutter资源?_Android_Flutter - Fatal编程技术网

Android 有没有办法从本机代码访问Flutter资源?

Android 有没有办法从本机代码访问Flutter资源?,android,flutter,Android,Flutter,我想在我的原生Android代码中使用Flitter资源中的主徽标-例如,显示通知。正如您所知,在Android中,您通常从drawable文件夹获取资源,如R.drawable.icon。但是我还必须将图标复制到Android drawable文件夹中。也许有一种方法可以从本机代码中访问flatter资源(读取资产)在本教程中有一个很好的章节 为android(自1.22起)提供一个资产“icons/heart.png”: flatterLoader=flatterInjector.insta

我想在我的原生Android代码中使用Flitter资源中的主徽标-例如,显示通知。正如您所知,在Android中,您通常从
drawable
文件夹获取资源,如
R.drawable.icon
。但是我还必须将图标复制到Android drawable文件夹中。也许有一种方法可以从本机代码中访问flatter资源(读取资产)

在本教程中有一个很好的章节

为android(自1.22起)提供一个资产“icons/heart.png”:

flatterLoader=flatterInjector.instance().flatterLoader()

String key=loader.getLookupKeyForAsset(“icons/heart.png”)

国际监督组织(swift):

let key=registrator.lookupKey(对于集合:“icons/heart.png”)

让path=Bundle.main.path(forResource:key,of type:nil)

对于iOS(obj-c):

NSString*key=[Registrator lookupKeyForAsset:@“icons/heart.png”]

NSString*路径=[[NSBundle mainBundle]路径资源:键 类型:nil]

对于1.22版之前的android(已弃用):

AssetManager AssetManager=registrator.context().getAssets()

String key=registrator.lookupKeyForAsset(“icons/heart.png”)

AssetFileDescriptor fd=assetManager.openFd(键)


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

在文章中有一个很好的章节

为android(自1.22起)提供一个资产“icons/heart.png”:

flatterLoader=flatterInjector.instance().flatterLoader()

String key=loader.getLookupKeyForAsset(“icons/heart.png”)

国际监督组织(swift):

let key=registrator.lookupKey(对于集合:“icons/heart.png”)

让path=Bundle.main.path(forResource:key,of type:nil)

对于iOS(obj-c):

NSString*key=[Registrator lookupKeyForAsset:@“icons/heart.png”]

NSString*路径=[[NSBundle mainBundle]路径资源:键 类型:nil]

对于1.22版之前的android(已弃用):

AssetManager AssetManager=registrator.context().getAssets()

String key=registrator.lookupKeyForAsset(“icons/heart.png”)

AssetFileDescriptor fd=assetManager.openFd(键)


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

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

下面是从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 ?? ""
    }

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

下面是从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.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中,只是以“flatter_assets/”作为前缀。因此,在上面的示例中,它将返回flatter\u assets/assets/my\u assets

,因为我写这篇文章时,它已经过时了。在我的颤振版本中,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中,只是以“flatter_assets/”作为前缀。因此,在上述示例中,它将返回颤振资产/assets/my_资产更新新版本

对于颤振版本1.22或更高版本,颤振加载器只能通过颤振注入器访问

导入io.flatter.flatterInjector

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

更新新版本

对于颤振版本1.22或更高版本,颤振加载器只能通过颤振注入器访问

导入io.flatter.flatterInjector

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

是否尝试运行由
flatter run
/
flatter build
工具创建的
.apk
文件?您是否注意到它在根目录中包含
资产
文件夹?是否尝试使用
颤振运行
/
颤振构建
工具创建的
.apk
文件?你有没有注意到它在根目录中包含
assets
文件夹?如果我不是在插件上,而是在main活动中呢?如何将AssetFileDescriptor转换为可绘制文件或资源?PluginRegistry.Registrator已被弃用。@SurajNair的答案包含更新的代码。如果我不是在插件上,而是在MainActivity中,该怎么办?如何将AssetFileDescriptor转换为可绘制文件或资源?PluginRegistry.Registrator已被弃用。@SurajNair的答案包含更新的代码。然后,如何将您的钥匙转换为可拉拔的?然后,如何将您的钥匙转换为可拉拔的?