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.

Также стоит отметить, что я пытаюсь сделать это из модульного теста. Любые идеи о том, как правильно это сделать? Благодарю!

Ответ 1

Имя папки "активы" не добавлено магически. Обновите свой pubspec.yaml чтобы включить полный путь к активу.

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

Ответ 2

Вот более полный ответ для будущих посетителей.

Создать папку ресурсов

Создайте папку ресурсов в корневой папке вашего проекта. В Android Studio вы можете щелкнуть правой кнопкой мыши схему проекта и перейти в " Создать"> "Каталог".

assets

Вы можете создать другую подпапку для текстовых файлов в assets если хотите. Но если вы это сделаете, вы должны включить относительный путь в pubspec.yaml. Увидеть ниже.

Добавьте ваш текстовый файл в новую папку

Вы можете просто скопировать ваш текстовый файл в каталог assets. Например, относительный путь my_file.txt будет assets/my_file.txt.

Зарегистрируйте папку ресурсов в pubspec.yaml

Откройте файл pubspec.yaml, который находится в корне вашего проекта.

Добавьте подраздел активов в секцию флаттера следующим образом:

flutter:
  assets:
    - assets/my_file.txt

Если у вас есть несколько файлов, которые вы хотите включить, то вы можете не указывать имя файла и просто использовать имя каталога (включая финальный /):

flutter:
  assets:
    - assets/

Получить текст в коде

Вы можете использовать глобальный rootBundle чтобы получить актив текстового файла:

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

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

Или, если у вас есть BuildContext (внутри виджета), вы можете использовать DefaultAssetBundle. Это рекомендуется, поскольку позволяет переключать пакеты ресурсов во время выполнения, что полезно для многоязычных активов.

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

Смотрите также

Ответ 3

На мой взгляд, чтобы загрузить файл js во флаттер, вы должны рассматривать его как текстовый файл и загружать его правильно. Итак, вам нужно добавить файл в папку активов, добавить в файл 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();
  }
}