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

Flutter使用translator包时snapshot.data返回null问题

问题根源

返回null是三个问题叠加导致的:

  • FutureBuilder 没有处理异步请求的加载状态、错误状态,异步任务未完成、请求报错时,snapshot.data 默认值就是null,直接渲染这个值自然一直显示null。
  • 该插件默认调用免费公开的谷歌翻译接口,国内网络环境无法直连,请求会直接抛出超时/连接拒绝异常,根本拿不到翻译结果。
  • 把翻译请求直接写在FutureBuilder的future参数里,每次组件重建都会重新发起请求,容易触发接口限流、重复请求异常。
修复方案

1. 补全异常捕获,兜底失败场景

给翻译方法加try-catch,请求失败时直接返回原文本,避免出现null:

Future<String> translate(String input, String to) async {
  try {
    final translator = GoogleTranslator();
    // 本地开发有代理的话加这行配置代理,替换成你自己的代理端口
    // final translator = GoogleTranslator(
    //   client: HttpClient()..findProxy = (uri) => "PROXY 127.0.0.1:7890"
    // );
    final translation = await translator.translate(input, from: 'en', to: to);
    return translation.text;
  } catch (e) {
    debugPrint("翻译请求异常: $e");
    return input;
  }
}

2. 修正StatefulWidget的Future初始化逻辑

不要在build方法里初始化异步请求,把请求放到initState里,仅初始化一次,同时监听组件参数变化,参数更新时重新触发翻译:

class TranslatedText extends StatefulWidget {
  final String data;
  final String to;
  const TranslatedText({super.key, required this.data, required this.to});

  @override
  State<TranslatedText> createState() => _TranslatedTextState();
}

class _TranslatedTextState extends State<TranslatedText> {
  late Future<String> _translateTask;
  // 缓存控制器实例,避免每次build都新建
  final _controller = MainController();

  @override
  void initState() {
    super.initState();
    _translateTask = _controller.translate(widget.data, widget.to);
  }

  @override
  void didUpdateWidget(covariant TranslatedText oldWidget) {
    super.didUpdateWidget(oldWidget);
    // 入参变化时重新翻译
    if (oldWidget.data != widget.data || oldWidget.to != widget.to) {
      _translateTask = _controller.translate(widget.data, widget.to);
    }
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String>(
      future: _translateTask,
      builder: (context, snapshot) {
        // 加载状态显示小进度条,不想显示可以直接返回原文本占位
        if (snapshot.connectionState != ConnectionState.done) {
          return const SizedBox(
            width: 14,
            height: 14,
            child: CircularProgressIndicator(strokeWidth: 2),
          );
        }
        // 异常/无数据时兜底显示原文本
        if (!snapshot.hasData || snapshot.hasError) {
          return Text(widget.data);
        }
        return Text(snapshot.data!);
      },
    );
  }
}
注意事项
  • 免费公开的翻译接口稳定性差、限流严格,仅适合本地测试使用,生产环境建议替换为正规商用翻译API。
  • 配置代理后如果仍请求失败,查看debug控制台打印的异常日志,针对性排查网络、参数、权限问题。
  • 所有异步组件使用FutureBuilder/StreamBuilder时,必须先判断连接状态、数据有效性,不能直接读取snapshot的data属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:12:30