Flutter 当我调用一个函数时,我在颤振中遇到了这个问题';未来<;字符串>';can';不能分配给参数类型';字符串'&引用;
Dart中的变量有此问题,我想从函数Flutter 当我调用一个函数时,我在颤振中遇到了这个问题';未来<;字符串>';can';不能分配给参数类型';字符串'&引用;,flutter,dart,Flutter,Dart,Dart中的变量有此问题,我想从函数read()中读取字符串值,但出现以下错误: 无法将参数类型“Future”分配给参数类型“String” 这是我的功能代码: read() async { final prefs = await SharedPreferences.getInstance(); String key = 'Code_Abo'; String value = prefs.get(key ) ?? 0; // String rr = value.toString(
read()
中读取字符串值,但出现以下错误:
无法将参数类型“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);
}
这里我想使用返回值(作为字符串):
提前谢谢你 我请求从
build(BuildContext)
方法调用您的QrImage
。实际上,read()
方法返回Future
,而不是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'),
);
}
}
类演示扩展StatefulWidget{
@凌驾
_DemoSate createState()=>_DemoSate();
}
类_DemoSate扩展状态{
字符串数据;
Future read()异步{
final SharedReferences prefs=等待SharedReferences.getInstance();
最终字符串键='Code_Abo';
返回prefs.getString(键)??“”;
}
@凌驾
void initState(){
super.initState();
read()。然后((值){
设置状态(){
数据=价值;
});
});
}
@凌驾
小部件构建(构建上下文){
返回数据==null
?文本(“加载”)
:qr图像(
数据:数据,
版本:QrVersions.auto,
尺寸:250.0,
填充:仅限边缘设置(左:75.0,右:75.0),
//嵌入图像:AssetImage('assets/logo.png'),
);
}
}
更新:Abion47先生在下面的下一个答案中提供了一个更好的解决方案,这一想法与之相同。
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'),
);
},
),
FutureBuilder(
未来:read(),
构建器:(\uux,快照){
如果(!snapshot.hasData){
//返回一些东西以显示未来尚未完成
返回循环ProgressIndicator();
}
返回QrImage(
数据:snapshot.data,
版本:QrVersions.auto,
尺寸:250.0,
填充:仅限边缘设置(左:75.0,右:75.0),
//嵌入图像:AssetImage('assets/logo.png'),
);
},
),
您应该添加wait:字符串值=(wait prefs.get(key))??0;代码>不起作用,我得到一个空值是prefs.getString(key)
?您不应该使用带有initState
和setState
的复杂设置以及一个数据字段来等待和处理未来的结果。这正是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'),
);
},
),