我想在手機上做簡單的“翻譯”,單詞來自名為“test.xml”的 XML 檔案。這是它的外觀:

當我在 my 中輸入正確的單詞TextField并單擊按鈕時,它會運行一個函式getXmlFile()并將其值存盤在_translatedText2:
ButtonClass(
whenClick: () async {
final _translatedText2 = await getXmlFile(context, _typedText);
print("value of var where should be translation: $_translatedText2");
setState(() {
_typedText = _searchValue.text;
_translatedText1 = _translatedText2.toString();
});
},
)
此函式從中獲取值test.xml并將其轉換為翻譯單詞串列。
我粘貼getXmlFile():
Future<List<String>> getXmlFile(BuildContext context, _typedText) async {
String xmlString =
await DefaultAssetBundle.of(context).loadString("assets/test.xml");
var raw = xml.XmlDocument.parse(xmlString);
var elements = raw.findAllElements(_typedText);
return elements.map((node) {
return (node.text);
}).toList();
}
那么,問題出在哪里???
_translatedText2具有翻譯文本的價值,這很好,但他只有在第二次點擊后才獲得它,然后我在螢屏上看到我的翻譯。應該馬上。
我的有益觀察
第一次點擊后_translatedText2只是空的。我知道它,因為我在之后列印了它的值getXmlFile() (這print()是在代碼中),它列印出空的字串串列。
正如我所說,只有在第二次單擊按鈕后,它才會列印出正確的值。那是問題。
ButtonClass(縮短為更具可讀性):
class ButtonClass extends StatefulWidget {
ButtonClass({Key? key, required this.whenClick}) : super(key: key);
VoidCallback whenClick;
@override
State<ButtonClass> createState() => _ButtonClassState();
}
class _ButtonClassState extends State<ButtonClass> {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: widget.whenClick,
child: const Icon(
Icons.translate,
));
}
}
最后MyHomePage(縮短為更具可讀性):
void main() {
runApp(const MyApp());
WidgetsFlutterBinding.ensureInitialized();
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage("text"),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage(String text, {Key? key}) : super(key: key);
@override
State<MyHomePage> createState() => _MyHomePageState();
}
final _searchValue = TextEditingController();
String _typedText = "finding txt";
String _translatedText1 = "translation";
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
getXmlFile(context, _typedText);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body:
Column(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [
Text(
"Search Word",
style: GoogleFonts.overpass(
fontSize: 40, color: Colors.white, fontWeight: FontWeight.bold),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 104.0),
child: TextField(
controller: _searchValue,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.search),
hintText: "Enter Word",
),
),
),
Center(child: ButtonClass(
whenClick: () async {
final _translatedText2 = await getXmlFile(context, _typedText);
print("wartosc po funkcji:$_translatedText2");
setState(() {
_typedText = _searchValue.text;
_translatedText1 = _translatedText2.toString();
});
},
)),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
Text("finding text::"),
Text(_typedText,
textAlign: TextAlign.center,
style: GoogleFonts.overpass(
color: Colors.green,
))
]),
Wrap(children: [
Text("translation:"),
Text(_translatedText1,
textAlign: TextAlign.center,
style: GoogleFonts.overpass(
color: Colors.red,
))
])
]));
}
}
uj5u.com熱心網友回復:
whenClick: () async {
final _translatedText2 = await getXmlFile(context, _typedText);
print("value of var where should be translation: $_translatedText2");
setState(() {
_typedText = _searchValue.text;
_translatedText1 = _translatedText2.toString();
});
},
在此代碼塊中,您搜索_typedText但僅在搜索完成后設定。所以你的結果基本上總是落后一步。
該行可能應該是:
final _translatedText2 = await getXmlFile(context, _searchValue.text);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462288.html
