当我调用函数时,我在颤振中遇到了这个问题" 'Future<String>' can't be assigned to the parameter type 'String'"



我在 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在下面的下一个答案中。

相关内容

最新更新