我在Dart中存在变量问题,我想从函数read()
中读取String值,但出现此错误:
不能将参数类型“ Future”分配给参数类型“ String”
这是我的功能代码:
read() async {
final prefs = await SharedPreferences.getInstance();
String key = 'Code_Abo';
String value = prefs.get(key ) ?? 0;
// String rr = value.toString();
//print(value.toString());
return(value);
}
在这里,我想使用返回值(作为字符串):
QrImage(
data: read(),
version: QrVersions.auto,
size: 250.0,
padding: EdgeInsets.only(left: 75.0, right: 75.0),
// embeddedImage: AssetImage('assets/logo.png'),
),
预先感谢您...
答案 0 :(得分:1)
read
返回一个future,如果要使用它返回的字符串值,则需要等待future完成。如果要在窗口小部件中使用它,请使用FutureBuilder
:
FutureBuilder<String>(
future: read(),
builder: (_, snapshot) {
if (!snapshot.hasData) {
// Return something to show the future hasn't completed yet
return CircularProgressIndicator();
}
return QrImage(
data: snapshot.data,
version: QrVersions.auto,
size: 250.0,
padding: EdgeInsets.only(left: 75.0, right: 75.0),
// embeddedImage: AssetImage('assets/logo.png'),
);
},
),
答案 1 :(得分:-1)
我欢迎从QrImage
方法调用您的build(BuildContext)
。实际上,read()
方法返回Future<dynamic>
而不是String
。这就是async
关键字的作用。另一个故事,您不应该等待build(BuildContext)
方法中的任何事情。在加载数据期间准备占位符的解决方案。还有一件事,应该是prefs.getString(String)
而不是prefs.get(String)
演示代码:
class Demo extends StatefulWidget {
@override
_DemoSate createState() => _DemoSate();
}
class _DemoSate extends State<Demo> {
String data;
Future<String> read() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final String key = 'Code_Abo';
return prefs.getString(key) ?? "";
}
@override
void initState() {
super.initState();
read().then((value) {
setState(() {
data = value;
});
});
}
@override
Widget build(BuildContext context) {
return data == null
? Text('Loading')
: QrImage(
data: data,
version: QrVersions.auto,
size: 250.0,
padding: EdgeInsets.only(left: 75.0, right: 75.0),
// embeddedImage: AssetImage('assets/logo.png'),
);
}
}
已更新:在下面的下一个答案中,阿比恩47先生提供了相同的想法并提供了更好的解决方案。