Flutter 当我调用一个函数时,我在颤振中遇到了这个问题';未来<;字符串>';can';不能分配给参数类型';字符串'&引用;

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(

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();
  //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'),
    );
  },
),