import 'dart:convert'; import 'dart:developer'; import 'package:dio/dio.dart'; abstract class DataLoader { final Dio dio; DataLoader(this.dio) { dio.options.connectTimeout = const Duration(seconds: 10); dio.options.sendTimeout = const Duration(seconds: 30); dio.options.receiveTimeout = const Duration(seconds: 30); } Future run() async { final response = await fetch(); try { return assemble(DataLoaderResult( json: jsonDecode(response.data!), headers: response.headers.map.map((key, value) => MapEntry(key, value.join(';'))), )); } catch (e, stack) { log('DataLoader assemble failed', error: e, stackTrace: stack); rethrow; } } Future> fetch(); TResult assemble(DataLoaderResult data); } class DataLoaderResult { final dynamic json; final Map headers; Map asMap() => json as Map; List asList() => json as List; List> asListOfMaps() => asList().map((e) => e as Map).toList(); DataLoaderResult({required this.json, required this.headers}); }