web-dev-qa-db-fra.com

Flutter - Lire le fichier texte des ressources

J'ai un fichier texte (.txt) que je voudrais être un atout que je peux scanner plus tard.

Dans le pubspec.yaml, je me suis assuré que:

flutter:
  assets:
    - res/my_file.txt

existe. Le fichier réside dans le res/ dossier que j'ai créé, au même niveau que lib/Android/ et ios/

J'essaie de lire le fichier d'une classe personnalisée, pas un widget.

Selon la documentation, je dois utiliser cette importation:

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

et commencez à lire comme ceci:

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

Et pour obtenir les données réelles, faites:

String data = await getFileData(fileName);

Cependant, lorsque j'utilise un fileName comme 'assets/res/my_file.txt', J'obtiens une erreur: Unable to load asset: assets/res/my_file.txt.

Il convient également de noter que j'essaie de le faire à partir d'un test unitaire. Des idées sur la façon de le faire correctement? Merci!

21
Jellio

Le nom de dossier "actifs" n'est pas ajouté par magie. Mettez à jour votre pubspec.yaml pour inclure le chemin d'accès complet à l'élément.

flutter:
  assets:
    - assets/res/my_file.txt
22
Collin Jackson

Voici une réponse plus complète pour les futurs visiteurs.

Créer un dossier d'actifs

Créez un dossier de ressources dans le dossier racine de votre projet. Dans Android Studio, vous pouvez cliquer avec le bouton droit sur le plan du projet et accéder à Nouveau> Répertoire .

assets

Vous pouvez créer un autre sous-dossier pour les fichiers texte dans assets si vous le souhaitez. Mais si vous le faites, vous devez inclure le chemin relatif dans pubspec.yaml. Voir ci-dessous.

Ajoutez votre fichier texte dans le nouveau dossier

Vous pouvez simplement copier votre fichier texte dans le répertoire assets. Le chemin relatif de my_file.txt, par exemple, serait assets/my_file.txt.

Enregistrez le dossier des ressources dans pubspec.yaml

Ouvrez le fichier pubspec.yaml qui se trouve à la racine de votre projet.

Ajoutez une sous-section d'actifs à la section Flutter comme ceci:

flutter:
  assets:
    - assets/my_file.txt

Si vous souhaitez inclure plusieurs fichiers, vous pouvez laisser le nom du fichier et utiliser simplement le nom du répertoire (inclure le final /):

flutter:
  assets:
    - assets/

Obtenez le texte dans le code

Vous pouvez utiliser le global rootBundle pour obtenir l'actif du fichier texte:

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

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

Ou si vous avez le BuildContext (à l'intérieur d'un widget), vous pouvez utiliser DefaultAssetBundle. Ceci est recommandé car il permet de changer de bundle d'actifs lors de l'exécution, ce qui est utile pour les actifs multilingues.

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

Voir également

23
Suragch

À mon avis, pour charger un fichier js dans un flutter, vous devez le considérer comme un fichier texte et le charger correctement. Donc, vous devez ajouter le fichier au dossier d'actifs, l'ajouter dans un fichier pubspec, puis le charger. lire la réponse complète ici

Deuxièmement, vous avez utilisé evalJavascript. cette fonction peut être utilisée dans de nombreuses situations différentes. mais cela ne fonctionnera que si vous avez un panneau d'affichage.

Vérifiez l'exemple ci-dessous:

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();
  }
}
1
Kashif Ahmed