अतीत में, मैं http क्लाइंट का उपयोग करता हूं जो Future<Response> लौटाता है। मैंने देखा है कि मैं अन्य प्रकार को .then() विधि के अंदर वापस कर सकता हूं और अंतिम प्रकार का परिणाम उस प्रकार के अनुसार बदल जाएगा जो मैंने उस समय के अंदर लौटाया था।

लेकिन जब मैं एक पैकेज का उपयोग करने के लिए बदलता हूं जो Future<dynamic> लौटाता है, तो .then() के अंदर अलग-अलग प्रकार लौटाने से अंतिम परिणाम प्रकार नहीं बदलता है। इसका परिणाम Future<dynamic> होता रहता है। लेकिन मैं आश्वस्त कर सकता हूं कि गतिशील प्रकार एक Response प्रकार है। मैंने जो कोशिश की है वह यहां है:

पहला:

Future<Response> get(String url) =>
    fetcher.get(url).then((response) => response as Response); // error: Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<Response>'

दूसरा:

Future<Response> get(String url) =>
    fetcher.get(url) as Future<Response>; // error: Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<Response>'

तीसरा:

Future<Response> get(String url) =>
    fetcher.get(url).then((response) { 
        final result = response as Response;
        return result;
    }); // error: Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<Response>'

भूतकाल में:

Future<List<Model>> get(String url) =>
    client.get(url).then((response) => Model.fromJson(response.body)); // working.

पैकेज जो मैंने इसके लिए उपयोग किया: https://pub.dev/packages/twitter_api#- उदाहरण-टैब-

संपादित करें: फ़ेचर के बारे में स्पष्ट करने के लिए:

import 'package:twitter_api/twitter_api.dart';
import "package:http/http.dart";


twitterApi fetcher = twitterApi(
    consumerKey: consumerApiKey,
    consumerSecret: consumerApiSecretKey,
    token: locker.session?.token,
    tokenSecret: locker.session?.secret
);

Future<Response> get(String path) {
    final split = url.split("?");
    final onlyPath = split[0];
    final onlyParam = split.length > 1 ? split[1] : "";
    final options = Map.fromIterable(onlyParam.split("&").where((it) => it.contains("=")), key: (e) => e.split("=")[0] as String, value: (e) => e.split("=")[1] as String);
    return fetcher.getTwitterRequest("GET", onlyPath.replaceFirst("/", "", options: options).then((response) {
        debugPrint ("GET ${response.request.url} Response: ${response.body}");
        return response as Response;
    }); 
}

आउटपुट:

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<Response>'
#0      TwitterApiProvider.fetchUser (package:feazy/src/resources/twitter_api_provider.dart:11:70)
#1      Repository.fetchUser (package:feazy/src/resources/repository.dart:19:27)
#2      _HomeState.twitterLogin (package:feazy/src/ui/home.dart:50:21)
...
GET https://api.twitter.com/1.1/users/show.json?screen_name=somescreenname Response: {"id":<int>,"id_str":<string>,"name":"Some name","screen_name":"somescreenname",...

संपादित करें 2: आगे की जांच पर, मैंने देखा कि आईडीई पर, आईडीई मुझे बताता है कि fetcher.getTwitterRequest() का रिटर्न प्रकार Future<dynamic> नहीं, बल्कि dynamic है। तो मैं इस तरह अपना कोड बदलता हूं, लेकिन यह अभी भी काम नहीं करेगा।

Future<Response> get (String path) {
    ...
    final future = authClient.getTwitterRequest(...).then((response) {
        debugPrint ("POST ${response.request.url} Response: ${response.body}");
        return response as Response;
    });
    final futureResponse = future as Future<Response>;
    return futureResponse;
}

इस मामले में, त्रुटि final futureResponse = future as Future<Response>; पर है, एक ही बात कह रही है: Unhandled Exception: type 'Future<dynamic>' is not a subtype of type 'Future<Response>' in type cast

0
Chen Li Yong 29 जिंदा 2020, 08:00

1 उत्तर

सबसे बढ़िया उत्तर

IMHO, आपके सभी उदाहरण ठीक हैं, लेकिन त्रुटि वास्तव में हमें बताती है कि आपने Future<Response> को Future<dynamic> में डालने का प्रयास किया है

अपडेट करें

आप async await का उपयोग कर सकते हैं, कुछ इस तरह:

Future<Response> get(String path) async {
    final split = url.split("?");
    final onlyPath = split[0];
    final onlyParam = split.length > 1 ? split[1] : "";
    final options = Map.fromIterable(onlyParam.split("&").where((it) => it.contains("=")), key: (e) => e.split("=")[0] as String, value: (e) => e.split("=")[1] as String);
    final response = await fetcher.getTwitterRequest("GET", onlyPath.replaceFirst("/", "", options: options); 
    return response as Response;
}
0
Hian 29 जिंदा 2020, 10:42