createDio function

Dio createDio({
  1. bool useCookies = true,
})

Creates a new Dio instance with configured interceptors.

On Android and iOS, HTTPS requests ride on the platform's native TLS stack via NativeAdapter (Cronet on Android, URLSession on iOS). Campus Wi-Fi has a TLS DPI that RSTs connections whose ClientHello fingerprint isn't on its allowlist; dart:io's BoringSSL fails, but Cronet and URLSession pass.

Cookies are shared across clients via the global cookieJar by default. Set useCookies to false for public requests that must remain isolated from authenticated session state.

Implementation

Dio createDio({bool useCookies = true}) {
  final dio = Dio()
    ..options = BaseOptions(
      validateStatus: (status) => status != null && status < 400,
      followRedirects: false,
    );

  if (Platform.isAndroid || Platform.isIOS) {
    dio.httpClientAdapter = NativeAdapter(
      createCupertinoConfiguration: () =>
          URLSessionConfiguration.defaultSessionConfiguration()
            ..httpShouldSetCookies = false,
    );
  }

  dio.interceptors.addAll([
    if (useCookies) CookieManager(cookieJar), // Store cookies
    NullHeaderInterceptor(), // Strip Cookie: null from dio_cookie_manager
    ClientIdentifierInterceptor(), // Identify app on campus Wi-Fi
    HttpsInterceptor(), // Enforce HTTPS
    RedirectInterceptor(() => dio), // Handle redirects within this Dio instance
    LogInterceptor(), // Log requests and responses
  ]);

  return dio;
}