当我调用函数“'Future <String>'无法分配给参数类型'String'”时,我在颤抖中遇到了这个问题

时间:2019-11-22 02:11:32

标签: flutter dart

我在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'),
),

预先感谢您...

2 个答案:

答案 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先生提供了相同的想法并提供了更好的解决方案。