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

Flutter国际化传递动态字符串报错:[]运算符未定义

解决Flutter国际化动态字符串传递问题

错误原因

你用t![title]这种Map索引的方式访问本地化字符串是错误的——通过flutter_gen生成的AppLocalizations类,其本地化文本是实例方法/属性,而非键值对Map,因此不支持[]运算符。正确的调用方式应为t.homePageTitle这类直接调用属性的形式,而非t['homePageTitle']。

解决方案(推荐类型安全的实现方式)

修改通用布局PageScaffold,让它接收一个本地化字符串构建函数,而非直接传字符串键:

  1. 修改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,
    );
  }
}
  1. 在父页面使用时,传入具体的本地化方法:
PageScaffold(
  // 直接传入AppLocalizations的对应属性/方法
  titleBuilder: (t) => t.homePageTitle,
  currentRoute: '/home',
  body: const HomePageContent(),
)

其他可选方案(不推荐)

  • 直接传本地化后的字符串:在父页面先获取AppLocalizations实例,把本地化后的字符串传给PageScaffold。但这种方式需要父页面持有BuildContext,且布局嵌套较深时灵活性不足。
  • 手动维护键值映射:创建一个Map将字符串键映射到对应的本地化方法,但这种方式没有编译时检查,容易因键名拼写错误导致运行时问题。

内容的提问来源于stack exchange,提问作者rafael anno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:06:12