You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter字符串插值生成文件路径失效问题求助

Flutter动态生成Asset路径丢失.json后缀问题解决

我尝试通过变量动态加载assets中的JSON资源,将书籍名称传入后拼接路径,但运行时出现路径丢失.json后缀的错误,静态写死路径则正常工作。

初始实现代码

late final String selectedBook;

@override
void initState() {
  super.initState();
  selectedBook = widget.bookName;
  print(selectedBook);
  final String book = selectedBook.toLowerCase().replaceAll(' ', '');
  loadAsset(book);
}


Future<void> loadAsset(String book) async {
  final String response = await rootBundle.loadString('assets/json/$book.json');
  final data = await json.decode(response);
  final secondLastIndex = data.length - 2;
  final chapterNumbers = data[secondLastIndex]['chapterNumber'];
  print(chapterNumbers);

  return chapterNumbers;
}

错误现象

运行时抛出异常:

Unhandled Exception: Unable to load asset: "assets/json/peter

路径仅解析到变量部分,丢失了.json后缀。我尝试在initState中生成完整路径并打印:

void initState() {
  super.initState();
  selectedBook = widget.bookName;
  print(selectedBook);
  final String book = selectedBook.toLowerCase().replaceAll(' ', '');
  final filepath = "assets/json/$book.json";
  print(filepath);
  loadAsset(book);
}

打印结果显示为assets/json/exodus而非预期的assets/json/exodus.json,使用字符串拼接final filepath = 'assets/json/' + book + '.json';结果依然相同。完整日志如下:

I/flutter (29955): exodus
I/flutter (29955): assets/json/exodus
E/flutter (29955): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Unable to load asset: "assets/json/exodus
E/flutter (29955): The asset does not exist or has empty data.
E/flutter (29955): #0      PlatformAssetBundle.load.<anonymous closure> (package:flutter/src/services/asset_bundle.dart:331:9)
E/flutter (29955): <asynchronous suspension>
E/flutter (29955): #1      AssetBundle.loadString (package:flutter/src/services/asset_bundle.dart:90:27)
E/flutter (29955): <asynchronous suspension>
E/flutter (29955): #2      _ChaptersState.loadAsset (package:bible/screens/chapters.dart:35:29)
E/flutter (29955): <asynchronous suspension>

问题根源与解决方法

问题核心

传入的书籍名称字符串末尾包含隐藏的换行符、制表符等空白字符,导致拼接后的路径中.json被隐藏字符截断,打印时这些不可见字符会让.json被换到下一行,看起来像是后缀丢失。

解决步骤

  1. 彻底清理所有空白字符
    替换原有的仅替换空格的逻辑,使用正则表达式匹配所有空白字符并移除:

    final String book = selectedBook.toLowerCase().replaceAll(RegExp(r'\s+'), '');
    

    正则\s+会匹配空格、换行、制表符等所有空白类型,确保字符串完全干净。

  2. 验证字符串处理结果
    可以添加长度打印,确认隐藏字符已被移除:

    print('原始字符串长度:${selectedBook.length}');
    print('处理后字符串长度:${book.length}');
    
  3. 可选:直接传入完整路径
    减少拼接环节,在initState中生成完整路径后传入方法:

    // initState中
    final String book = selectedBook.toLowerCase().replaceAll(RegExp(r'\s+'), '');
    final fullPath = "assets/json/$book.json";
    loadAsset(fullPath);
    
    // 修改loadAsset方法
    Future<void> loadAsset(String fullPath) async {
      final String response = await rootBundle.loadString(fullPath);
      // 后续逻辑不变
    }
    

内容的提问来源于stack exchange,提问作者Clinton Njiru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:30:12