Flutter国际化传递动态字符串报错:[]运算符未定义
解决Flutter国际化动态字符串传递问题
错误原因
你用t![title]这种Map索引的方式访问本地化字符串是错误的——通过flutter_gen生成的AppLocalizations类,其本地化文本是实例方法/属性,而非键值对Map,因此不支持[]运算符。正确的调用方式应为t.homePageTitle这类直接调用属性的形式,而非t['homePageTitle']。
解决方案(推荐类型安全的实现方式)
修改通用布局PageScaffold,让它接收一个本地化字符串构建函数,而非直接传字符串键:
- 修改
PageScaffold的参数定义:
import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:health_app_test/ui/containers/custom_drawer/custom_drawer.dart'; class PageScaffold extends StatelessWidget { final Widget body; // 改为接收函数,入参是AppLocalizations,返回对应本地化字符串 final String Function(AppLocalizations) titleBuilder; final String currentRoute; const PageScaffold({ super.key, required this.body, required this.titleBuilder, required this.currentRoute, }); @override Widget build(BuildContext context) { final t = AppLocalizations.of(context)!; return Scaffold( // 通过titleBuilder获取对应本地化文本 appBar: AppBar(title: Text(titleBuilder(t))), drawer: CustomDrawer(currentRoute: currentRoute), body: body, ); } }
- 在父页面使用时,传入具体的本地化方法:
PageScaffold( // 直接传入AppLocalizations的对应属性/方法 titleBuilder: (t) => t.homePageTitle, currentRoute: '/home', body: const HomePageContent(), )
其他可选方案(不推荐)
- 直接传本地化后的字符串:在父页面先获取
AppLocalizations实例,把本地化后的字符串传给PageScaffold。但这种方式需要父页面持有BuildContext,且布局嵌套较深时灵活性不足。 - 手动维护键值映射:创建一个Map将字符串键映射到对应的本地化方法,但这种方式没有编译时检查,容易因键名拼写错误导致运行时问题。
内容的提问来源于stack exchange,提问作者rafael anno
相关产品推荐
相关产品推荐

