【问题标题】:How to fix 'String is not subtype of type widget'?如何修复“字符串不是小部件类型的子类型”?
【发布时间】:2019-01-23 01:18:31
【问题描述】:

我正在尝试使用 GoogleTranslator 库来翻译输入文本,但我收到一个错误,提示 String 类型不是 Widget 类型的子类型

我尝试创建一个函数来接收文本并返回翻译后的文本并使用应用程序主体上的小部件

import 'package:flutter/material.dart';
import 'package:translator/translator.dart';

void main() => runApp(MyApp());

Widget translator(String input) {
  GoogleTranslator translator = GoogleTranslator();

  String translation = translator
      .translate("I would buy a car, if I had money.", from: 'en', to: 'ar')
      .toString();
  return translation as Widget;
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Translator'),
        ),
        body: Center(
          child: translator("Hello World"),
        ),
      ),
    );
  }
}

我希望输出是屏幕中心的翻译文本

【问题讨论】:

  • 我不知道translate() 做了什么,但我认为.toString(); 的返回值是多余的。
  • translate() 是谷歌翻译库中的预定义方法

标签: dart flutter google-translator-toolkit


【解决方案1】:
return translation as Widget;

应该是

return Text(translation);

更新

import 'package:flutter/material.dart';
import 'package:translator/translator.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Translator'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _translations = <String,String>{};

  String translator(String input) {
    if(_translations.containsKey(input)) {
      return _translations[input];
    } else {
      _translate(input);
      return input;
    }
  }

  Future<void> _translate(String input) async { 
    GoogleTranslator translator = GoogleTranslator();

    String translation = await translator
        .translate("I would buy a car, if I had money.", from: 'en', to: 'ar');
    setState(() => _translations[input] = translation);
  }

  @override
  Widget build(BuildContext context) {
    return Text(translator("Hello World"));
  }
}

【讨论】:

  • 返回文本(翻译);实际上修复了错误,但我在屏幕上显示了输出:Future' 的实例
  • 抱歉,该代码应该在 StatefulWidget 中。我一会儿再看看。
猜你喜欢
  • 2020-02-29
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2020-08-31
相关资源
最近更新 更多