flutter如何动态下载语言json文件

在Flutter项目中需要实现多语言切换功能,现在想动态下载不同语言的json文件而不是打包在assets里。请问如何实现以下功能:

  1. 从服务器下载指定语言的json文件
  2. 文件下载完成后实时更新应用语言
  3. 处理下载失败或网络异常的情况
  4. 如何缓存已下载的语言文件避免重复下载 有没有完整的代码示例可以参考?
2 回复

使用Flutter动态下载语言JSON文件的方法:

  1. 使用http或dio包发起网络请求
  2. 从服务器获取JSON文件
  3. 使用shared_preferences缓存文件
  4. 结合flutter_localizations实现动态语言切换

示例代码:

var response = await http.get(Uri.parse('url/to/lang.json'));
var jsonData = jsonDecode(response.body);
// 保存到本地并更新应用语言

更多关于flutter如何动态下载语言json文件的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中动态下载语言JSON文件,可以通过以下步骤实现:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  http: ^0.13.0
  flutter_localizations:
    sdk: flutter

2. 下载并存储JSON文件

使用 http 包下载文件,path_provider 获取本地存储路径:

import 'package:http/http.dart' as http;
import 'dart:io';
import 'package:path_provider/path_provider.dart';

Future<File> _downloadJson(String url, String fileName) async {
  final response = await http.get(Uri.parse(url));
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/$fileName');
  return file.writeAsBytes(response.bodyBytes);
}

3. 加载本地JSON文件

读取下载的文件并解析为Map:

Future<Map<String, dynamic>> _loadLocalJson(String fileName) async {
  final directory = await getApplicationDocumentsDirectory();
  final file = File('${directory.path}/$fileName');
  final contents = await file.readAsString();
  return jsonDecode(contents);
}

4. 集成到本地化

在MaterialApp中使用 LocalizationsDelegate 动态加载翻译:

class DynamicLocalizationsDelegate extends LocalizationsDelegate<DynamicLocalizations> {
  @override
  Future<DynamicLocalizations> load(Locale locale) async {
    final fileName = '${locale.languageCode}.json';
    final translations = await _loadLocalJson(fileName);
    return DynamicLocalizations(translations);
  }

  @override
  bool isSupported(Locale locale) => ['en', 'zh'].contains(locale.languageCode);

  @override
  bool shouldReload(covariant LocalizationsDelegate<DynamicLocalizations> old) => true;
}

5. 使用示例

// 下载语言文件
await _downloadJson('https://example.com/en.json', 'en.json');

// 在MaterialApp中配置
MaterialApp(
  localizationsDelegates: [
    DynamicLocalizationsDelegate(),
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: [Locale('en'), Locale('zh')],
)

注意事项:

  • 首次启动时需检查网络并下载所需语言文件
  • 处理下载失败和文件读取异常
  • 可结合 shared_preferences 缓存语言选择

这样即可实现动态下载和切换语言文件。

回到顶部