颤动 - 从资产中读取文本文件

时间:2017-06-29 03:47:22

标签: dart flutter

我有一个文本文件(.txt),我想成为一种资产,我可以在以后扫描。

在pubspec.yaml中,我确保:

flutter:
  assets:
    - res/my_file.txt

存在。该文件位于我创建的res/文件夹中,与lib/android/ios/

处于同一级别

我正在尝试从自定义类中读取文件,而不是小部件。

根据文档,我将使用此导入:

import 'package:flutter/services.dart' show rootBundle;

并开始阅读:

/// Assumes the given path is a text-file-asset.
Future<String> getFileData(String path) async {
  return await rootBundle.loadString(path);
}

要获得实际数据,请执行以下操作:

String data = await getFileData(fileName);

但是,当我使用fileName之类的'assets/res/my_file.txt'时,我收到错误:Unable to load asset: assets/res/my_file.txt

值得注意的是,我正试图通过单元测试来做到这一点。关于如何正确地做到这一点的任何想法?谢谢!

3 个答案:

答案 0 :(得分:20)

文件夹名称“assets”不会神奇地添加。更新您的pubspec.yaml以包含资产的完整路径。

flutter:
  assets:
    - assets/res/my_file.txt

答案 1 :(得分:13)

这里是将来访客的完整答案。

创建资产文件夹

在项目的根文件夹中创建一个资产文件夹。在Android Studio中,您可以右键单击“项目”大纲,然后转到新建>目录

assets

您可以根据需要在@prefix q: <https://stackoverflow.com/questions/54131709#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . [ q:someProperty "2.2"^^q:MyDatatype ] . q:MyDatatype a rdfs:Datatype ; owl:equivalentClass [ a rdfs:Datatype ; owl:onDatatype xsd:float ; owl:withRestrictions ( [ xsd:minInclusive "0.0"^^xsd:float ] [ xsd:maxInclusive "15.0"^^xsd:float ] ) ] . q:someProperty a owl:DatatypeProperty . 中为文本文件创建另一个子文件夹。但是,如果这样做,则必须在pubspec.yaml中包括相对路径。见下文。

将文本文件添加到新文件夹

您可以仅将文本文件复制到assets目录中。例如,assets的相对路径为my_file.txt

在pubspec.yaml中注册资产文件夹

打开位于项目根目录中的pubspec.yaml文件。

将资产子部分添加到flutter部分,如下所示:

assets/my_file.txt

如果要包含多个文件,则可以不使用文件名,而只使用目录名(包括最后的/):

flutter:
  assets:
    - assets/my_file.txt

获取代码中的文本

您可以使用全局flutter: assets: - assets/ 来获取文本文件资产:

rootBundle

或者,如果您具有BuildContext(在小部件内部),则可以使用DefaultAssetBundle。推荐这样做是因为它允许在运行时切换资产束,这对于多语言资产很有用。

import 'dart:async' show Future;
import 'package:flutter/services.dart' show rootBundle;

Future<String> loadAsset() async {
  return await rootBundle.loadString('assets/my_text.txt');
}

另请参见

答案 2 :(得分:1)

我认为,为了将js文件加载到文件中,您应该将其视为文本文件并正确加载。因此,您需要将文件添加到Assets文件夹,添加到pubspec文件,然后加载它。在此处阅读完整答案

第二,您使用了evalJavascript。此功能可以在许多不同的情况下使用。但是只有在有查看面板的情况下,它才有效。

检查以下示例:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

main() async {
  String jsCode = await rootBundle.loadString('assets/javascript.js');

  runApp(new MaterialApp(
    home: LunchWebView(jsCode),
  ));
}

class LunchWebView extends StatelessWidget {
  final String text;
  LunchWebView(this.text);

  @override
  Widget build(BuildContext context) {
    final FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();
    flutterWebviewPlugin.launch('https://www.google.com');
    flutterWebviewPlugin.evalJavascript(text);
    return Container();
  }
}