提问者:小点点

未处理的异常:类型“Future<Response>”不是类型“String”的子类型


我试图从Facebook获取数据。 http.get()返回future类型的数据。 该数据被传递给第二个函数,在这里数据被转换为字符串,使用jsonDecode函数。 我的代码返回代码返回错误类型“Future”在运行时不是类型“String”的子类型。

如何在我的代码中返回变量graphResponse,这是一个未来的<;http.response>; 并将其传递给jsonExtractor函数。 以下各项

class FetchFB {

  final String url;
  final String token;

  FetchFB({@required this.url, @required this.token});

  Future<http.Response> fetchData() async {
    http.Response graphResponse = await http.get('$url$token');
    print(graphResponse);
    return graphResponse;
  }

  dynamic jsonExtractor(dynamic dataResponse) async {
    return await jsonDecode(dataResponse);
  }
}

内主省道

    String url = 'https://graph.facebook.com/v7.0/me?fields=';
        String tok = '0BTkTGrLtBgsp35WQZDZD';
        
        class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      final bool _loggedIn = false;
      final fbLogin = FacebookLogin();
      
    
      void flogin() async {
        final result = await fbLogin.logIn(['email']);
        final token = result.accessToken.token; // Not used for the the time being
    
        FetchFB data = FetchFB(url: url, token: tok);
        var fb = data.fetchData();
        var fb1 = data.jsonExtractor(fb);
        print(fb1);
      }

@override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Center(
              child: OutlineButton(
                onPressed: () {
                  flogin();
                },
                child: Text('FaceBook'),
              ),
            )
          ],
        ),
      ),
    );
  }
}

共1个答案

匿名用户

你需要等待未来来完成。 同样要解码JSON,您需要从response.body获取JSON。

    String url = 'https://graph.facebook.com/v7.0/me?fields=';
        String tok = '0BTkTGrLtBgsp35WQZDZD';
        
        class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      final bool _loggedIn = false;
      final fbLogin = FacebookLogin();
      
    
      void flogin() async {
        final result = await fbLogin.logIn(['email']);
        final token = result.accessToken.token; 
   
        FetchFB data = FetchFB(url: url, token: tok);
        var fb = await data.fetchData(); // wait for the future to complete.
        var fb1 = data.jsonExtractor(fb);
        print(fb1);
      }

@override
  Widget build(BuildContext context) {
    return Center(
      child: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Center(
              child: OutlineButton(
                onPressed: () {
                  flogin();
                },
                child: Text('FaceBook'),
              ),
            )
          ],
        ),
      ),
class FetchFB {

  final String url;
  final String token;

  FetchFB({@required this.url, @required this.token});

  Future<http.Response> fetchData() async {
    http.Response graphResponse = await http.get('$url$token');
    print(graphResponse);
    return graphResponse;
  }

  dynamic jsonExtractor(dynamic dataResponse) async {
    return jsonDecode(dataResponse.body);
  }
}