【问题标题】:Reading YAML files in Flutter在 Flutter 中读取 YAML 文件
【发布时间】:2020-06-20 10:39:10
【问题描述】:

yaml 2.2.1 包帮助 Flutter 用户读取 YAML 文件。不幸的是,文档并没有启发我

import 'dart:convert';
import 'package:yaml/yaml.dart';

main() {
  // load a YAML file
  var doc = loadYaml("YAML: YAML Ain't Markup Language");
  print(doc['YAML']);

  // Encode a YAML file
  print(json.encode(doc));
}

我在文件夹中放了一个 YAML 文件

assets/yamlfiles/yamltoberead.yml

并在 pubspec.yaml 文件中写入必要的行。

我假设,我必须将“YAML:YAML Ain't ...”行更改为 yamltoberead.yml 文件的相对路径,但它会引发错误

type 'String' is not a subtype of type 'int' of 'index'

是否有其他方法可以读取 YAML 文件或如何修复错误?

【问题讨论】:

  • 你把依赖放在pubspec.yaml文件上了吗?
  • 是的,是yaml: ^2.2.1
  • 我没用过这个包,但我觉得应该是File('file.yaml').readAsString().then((String contents) { var doc = loadYaml(contents); });
  • File(yamlPath).readAsString().then(loadYaml) - 上述答案的较短版本

标签: flutter dart


【解决方案1】:

不要将"YAML: YAML Ain't Markup Language" 更改为您的 yaml 文件的路径, 首先加载 yaml 文件的字符串版本,然后使用 yaml 包将其转换为地图。这是一个示例(您需要导入 flutter/services.dart):

import "package:flutter/services.dart" as s;
import "package:yaml/yaml.dart";

final data = await s.rootBundle.loadString('assets/yamlToRead.yaml');
final mapData = loadYaml(data);
print(mapData);

这将打印包含您的 yaml 数据的地图。

【讨论】:

  • 谢谢... 有谁知道带 dept 的键是如何映射的?像key1这样的键:key2:值
  • 我相信它们被映射为地图内的地图,所以 {key1: {key2: value1, key3: value2}}。
【解决方案2】:

如果您需要在启动应用程序之前从pubspec.yaml 获取值,那么您需要:

  1. pubspec.yaml 作为asset 添加到要从中获取值的pubspec.yaml
  2. 在main方法中添加WidgetsFlutterBinding.ensureInitialized()
  3. 添加包yaml: ^3.1.0
  4. 停止应用并重新启动。

ma​​in.dart

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

    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await getAppVersion();
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(context) {
        return MaterialApp(home: HomePage());
      }
    }
    
    class HomePage extends StatelessWidget {
      @override
      Widget build(context) {
        return Scaffold();
      }
    }
    
    Future<void> getAppVersion() async {
      final yamlString = await rootBundle.loadString('pubspec.yaml');
      final parsedYaml = loadYaml(yamlString);
      print(parsedYaml['version']); // print 1.0.0+1
    }

pubspec.yaml

name: best_app
version: 1.0.0+1

environment:
  sdk: ">=2.16.1 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  yaml: ^3.1.0

flutter:
  assets:
    - pubspec.yaml # <-- add this 

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 2022-08-02
    • 2019-01-09
    • 2019-01-24
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多