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

时间:2019-05-28 09:59:35

标签: android flutter

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

4 个答案:

答案 0 :(得分:1)

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

下面是从快速的本机代码访问文件/图像路径的帮助方法。

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 :(得分:1)

截至我撰写本文时,documentation已过时。在我的flutter版本中, 1.17.1 是下面的 kotlin android 示例,上面带有必要的导入:

import React, { Component } from 'react';
    import './App.css';

 class App extends Component {
  constructor(props){
    super(props);
    this.state = {
      datas: []
    };
  }

  componentDidMount() {
    fetch('https://api.inquickerstaging.com/v3/winter.inquickerstaging.com/services')
    .then(res => res.json())
    .then((data) => {
      this.setState({ datas: data.data })
    })
    .catch(console.log)

  }

  render() {

    return (
        <ul>
            {this.state.datas.map((book) => (
                <li key={book.id}>{book.type}</li>
            ))}
        </ul>
    )
}
}
export default App;

请注意,此 getLookupKeyForAsset 方法返回的值通常是您的资产路径,包括在 pubspec.yaml 中资产下方,该路径的前缀为“ flutter_assets /”。因此,在上述示例中,它将返回 flutter_assets / assets / my_asset

答案 2 :(得分:1)

更新新版本

对于Flutter 1.22或更高版本,只能通过 FlutterInjector 访问 FlutterLoader

import io.flutter.FlutterInjector;

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

答案 3 :(得分:0)

flutter documentation中有一个不错的部分。

为Android提供资产“ icons / heart.png”:

  

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

     

字符串键= registrar.lookupKeyForAsset(“ icons / heart.png”);

     

AssetFileDescriptor fd = assetManager.openFd(key);

,对于iOS:

  

NSString *键= [注册商lookupKeyForAsset:@“ icons / heart.png”];

     

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

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