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

Flutter Dart创建const变量及多语言场景const文本组件实现

Flutter Dart 中创建const变量的方法

基础变量声明

直接使用const关键字定义,变量的值必须是编译时可确定的常量(不能是运行时生成的动态数据,比如用户输入、网络返回值):

// 基础类型const变量
const double pi = 3.14159;
const String appName = "MyApp";

// 不可变集合
const List<String> defaultTags = ["flutter", "dart"];
const Map<String, int> scoreMap = {"math": 90, "english": 85};

类的const对象

如果要创建不可变的类实例,类必须提供const构造函数,且所有成员变量必须是final:

class Product {
  final String id;
  final String name;

  // const构造函数,必须初始化所有final成员
  const Product(this.id, this.name);
}

// 创建const类实例
const Product defaultProduct = Product("1001", "Default Item");

EmojiPicker Config中Text组件依赖上下文时设为const的解决方案

问题核心:直接给依赖Localization或Theme上下文的Text加const会报错,因为AppLocalizations.of(context)、Theme.of(context)都是运行时动态获取的值,不符合const构造函数对编译时常量的要求。

可行方案:封装const自定义Localized Text组件

创建一个继承自StatelessWidget的const组件,将本地化key作为编译时常量参数传入,在build方法中再动态获取上下文的本地化和主题数据:

class LocalizedEmojiText extends StatelessWidget {
  // 本地化字符串的key,是编译时常量
  final String localeKey;

  const LocalizedEmojiText(this.localeKey, {super.key});

  @override
  Widget build(BuildContext context) {
    // 在build阶段动态获取上下文数据
    final localizations = AppLocalizations.of(context)!;
    final theme = Theme.of(context);

    return Text(
      localizations.translate(localeKey),
      style: theme.textTheme.bodySmall?.copyWith(color: theme.hintColor),
    );
  }
}

在EmojiPicker Config中使用

将Config中的Text替换为这个const自定义组件即可:

EmojiPicker(
  config: Config(
    // 使用const自定义组件,满足const要求
    searchHintText: const LocalizedEmojiText("emoji_search_hint"),
    // 其他配置...
  ),
)

原理说明

  • 自定义组件本身是const的,因为它的构造参数(本地化key)是编译时常量,不会触发不必要的刷新。
  • 组件的build方法仅在Localizations或Theme这类InheritedWidget发生变化时才会重新执行,既保证了上下文依赖的正确性,又避免了频繁刷新问题。

内容的提问来源于stack exchange,提问作者Cenk YAGMUR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:45:48