假设我有一个singleChildScrollView,其内容是从文件中读取的:
new singleChildScrollView(
padding: new EdgeInsets.all(8.0),
child: new Text(
getTextFromFile(), //<---read from file
style: new TextStyle(
fontWeight: FontWeight.bold,
fontSize: 19.0,
),
));
Future<String> getFileData(String path) async {
return await rootBundle.loadString(path);
}
Future<String> getTextFromFile() async {
return getFileData("test.txt");
}
我收到以下错误:
参数类型&#39;未来&#39;不能分配给参数 键入&#39; String&#39;。
如何解决问题?
答案 0 :(得分:10)
使用FutureBuilder应该可以解决您的问题。我修改了你的代码,你可以看到如何使用它。 <{1}}不是必需的。
initialData
答案 1 :(得分:8)
StatefullWidget
可用于此目的。
声明成员变量String _textFromFile = ""
;在您的州级中,使用setState()
方法更新其未来解决方案的价值。
我从构造函数中调用了您的getTextFromFile()
方法,但您可以从任何地方调用它。
运行代码:
import 'package:flutter/material.dart';
import 'dart:async';
class StatefullWidgetDemo extends StatefulWidget {
@override
_StatefulWidgetDemoState createState() {
return new _StatefulWidgetDemoState();
}
}
class _StatefulWidgetDemoState extends State<StatefullWidgetDemo> {
String _textFromFile = "";
_StatefulWidgetDemoState() {
getTextFromFile().then((val) => setState(() {
_textFromFile = val;
}));
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Stateful Demo'),
),
body: new SingleChildScrollView(
padding: new EdgeInsets.all(8.0),
child: new Text(
_textFromFile,
style: new TextStyle(
fontWeight: FontWeight.bold,
fontSize: 19.0,
),
),
),
);
}
Future<String> getFileData(String path) async {
return "your data from file";
}
Future<String> getTextFromFile() async {
return await getFileData("test.txt");
}
}
答案 2 :(得分:1)
这是一个类似的问题:
那里提出的解决方案非常优雅并且可以正常工作。 IDE表示期望Type
而不是Future<Type>
的地方,将await
放在该参数前面
答案 3 :(得分:0)
你可能需要一个FutureBuilder。
答案 4 :(得分:0)
获取初始化数据的另一种方法是在getTextFromFile()
中调用initState()
,使用新字符串设置状态并在小部件中使用该字符串:
String fileData = '';
Future<String> getFileData(String path) async {
return await rootBundle.loadString(path);
}
void getTextFromFile() async {
try {
String data = await getFileData("test.txt");
setState(() {
fileData = data;
});
} catch (ex) {
print(ex);
}
}
@override
void initState() {
super.initState();
getTextFromFile();
}
new singleChildScrollView(
padding: new EdgeInsets.all(8.0),
child: new Text(
fileData,
style: new TextStyle(
fontWeight: FontWeight.bold,
fontSize: 19.0,
),
));
答案 5 :(得分:0)
这里简单的答案=>
调用函数的类:
@override
Widget build(BuildContext context) {
return new Scaffold(
child: FutureBuilder(
future: function(),
builder: (BuildContext context, AsyncSnapshot<String> text) {
return new Text(text.data);
});
)}
函数:
Future<String> function() async {
return 'abc';
}