Flutter webで自前のDjangoサーバーのAPIから情報を取得する処理を実装しようとしていて、一度目の読み込みは上手くいった。
ただ、同じAPIから最新の情報を取得しようとして再度APIを叩こうとしても再度APIの呼び出しがされていない。
ブラウザ側なのか、Flutter側なのかで、一度叩いたAPIの情報はキャッシュしてあって再呼出しないような仕組みになっていると思われるのですが、これの解消方法がわかる方がいれば教えてください。
Flutter
デバック環境:Chrome
サーバー:localhost / Django
Widgetの該当部分のコード
TextButton( onPressed: () async { data = joinedselfCall();//ここのAPIが呼び出されない selected = 'joined'; setState(() {}); }, //ボタンが押されたら、dataを更新して、futurebuilderを再構築 child: Text( '参加済み', ), )),
該当APIの呼び出しに関わる関数の定義部分
Future<dynamic> joinedselfCall() => ApiManager.instance.makeApiCall( callName: 'joined', apiDomain: mainDomain, apiEndpoint: 'api/v1/joinedself/', callType: ApiCallType.GET, headers: { 'token': jwt, }, params: {}, returnResponse: true, );
APIの共通処理部分(ここから先は自分で書いていないのが、少なくとも呼び出し上はちゃんと動作している)
Future<dynamic> makeApiCall( {String callName, String apiDomain, String apiEndpoint, ApiCallType callType, Map<String, dynamic> headers = const {}, Map<String, dynamic> params = const {}, bool returnResponse}) async { final callRecord = ApiCallRecord(callName, apiDomain, apiEndpoint, headers, params); // Modify for your specific needs if this differs from your API. if (_accessToken != null) { headers[HttpHeaders.authorizationHeader] = 'Token $_accessToken'; } // If we've already made this exact call before, return the cached result. if (_apiCache.containsKey(callRecord)) { return _apiCache[callRecord]; } var result; switch (callType) { case ApiCallType.GET: result = await getRequest( apiDomain, apiEndpoint, headers, params, returnResponse); break; case ApiCallType.POST: result = await postRequest( apiDomain, apiEndpoint, headers, params, returnResponse); break; } if (result != null) { _apiCache[callRecord] = result; } return result; } }
static Future<dynamic> getRequest( String apiDomain, String endpoint, Map<String, dynamic> headers, Map<String, dynamic> params, bool returnResponse) async { //httpsに変更 var uri; if (params.isNotEmpty) { uri = Uri.http(apiDomain, endpoint, toStringMap(params)); } if (params.isEmpty) { uri = Uri.http(apiDomain, endpoint); } print('sendrequest'); final response = await http.get(uri, headers: toStringMap(headers)); print('get!'); return returnResponse ? json.decode(response.body) : null; }
最終的なhttpの処理は以下のパッケージに依存
'package:http/http.dart'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。