我在 Dart 中的变量方面遇到了这个问题,我想从我的函数read()
中读取字符串值,但我收到此错误:
未来"不能分配给参数类型"字符串">
这是我的函数代码:
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'),
),
提前谢谢你...
read
返回一个未来,如果你想使用它返回的字符串值,你需要等待未来完成。如果要在小部件中使用它,请使用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'),
);
},
),
我的客人希望从build(BuildContext)
方法调用您的QrImage
。实际上,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'),
);
}
}
更新:先生提供了更好的解决方案的相同想法。Abion47在下面的下一个答案中。