Flutter使用Translator时为何Future<Translation>不能赋值给String类型参数
问题根因
translator.translate() 是异步方法,返回的是Future<Translation>类型,而非直接返回翻译结果。你在自定义translate函数里是用.then()等待异步执行完成后才拿结果更新状态,所以能正常运行;但在build方法里直接调用text.translate(to: 'es').toString()是直接对未完成的Future对象做toString转换,自然没法拿到正确的字符串结果,还会触发类型匹配错误。
解决方案
方案1:使用FutureBuilder在build中直接处理异步渲染
该方案最贴合你想要在build里直接调用翻译的需求:
class _TranslateState extends State<Translate> { GoogleTranslator translator = GoogleTranslator(); String originalText = 'Hello , my name is Mehdi'; @override Widget build(BuildContext context) { return Container( child: FutureBuilder<Translation>( // 传入异步翻译任务 future: translator.translate(originalText, to: 'es'), builder: (context, snapshot) { // 加载中显示占位 if (snapshot.connectionState == ConnectionState.waiting) { return const Text('翻译中...'); } // 加载完成返回翻译结果 if (snapshot.hasData) { return Text(snapshot.data!.toString()); } // 报错显示错误提示 return const Text('翻译失败'); }, ), ); } }
方案2:提前触发翻译、用状态变量存储结果
和你现有translate方法的逻辑一致,把翻译结果提前存到状态里,build直接读状态变量即可,适合不需要在build时动态切换翻译目标语言的场景:
class _TranslateState extends State<Translate> { GoogleTranslator translator = GoogleTranslator(); String originalText = 'Hello , my name is Mehdi'; // 存储翻译后的西班牙语文本 String translatedEsText = ''; @override void initState() { super.initState(); // 页面初始化时就触发翻译 translateToEs(); } void translateToEs() { translator.translate(originalText, to: 'es').then((output) { setState(() { translatedEsText = output.toString(); }); }); } @override Widget build(BuildContext context) { return Container( child: Text(translatedEsText.isEmpty ? '加载中...' : translatedEsText), ); } }
内容的提问来源于stack exchange,提问作者Mehdi EL Garda
相关产品推荐
相关产品推荐

