Files
jinzhi/lib/common/network/dio_provider.dart
T
2026-08-13 17:17:52 +08:00

51 lines
1.6 KiB
Dart

import 'package:dio/dio.dart';
import 'package:fancy_dio_inspector/fancy_dio_inspector.dart';
import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../config/app_config.dart';
import '../storage/secure_identity_storage.dart';
import 'auth_interceptor.dart';
import 'kratos_error_interceptor.dart';
part 'dio_provider.g.dart';
const _protobufContentType = 'application/x-protobuf';
/// Per-request override for native protobuf-over-HTTP endpoints.
Options protobufOptions() => Options(
responseType: ResponseType.bytes,
contentType: _protobufContentType,
headers: const {'Accept': _protobufContentType},
);
@Riverpod(keepAlive: true)
AppConfig appConfig(Ref ref) => AppConfig.fromEnvironment();
@Riverpod(keepAlive: true)
Dio dio(Ref ref) {
final config = ref.watch(appConfigProvider);
final identityStorage = ref.watch(secureIdentityStorageProvider);
final d = Dio(
BaseOptions(
baseUrl: config.apiBaseUrl,
connectTimeout: const Duration(seconds: 15),
receiveTimeout: const Duration(seconds: 30),
responseType: ResponseType.bytes,
contentType: _protobufContentType,
headers: const {
'Accept': _protobufContentType,
'Content-Type': _protobufContentType,
},
),
);
d.interceptors.add(AuthInterceptor(identityStorage));
d.interceptors.add(KratosErrorInterceptor());
if (!kReleaseMode) {
d.interceptors.add(LogInterceptor(requestBody: false, responseBody: false));
}
d.interceptors.add(FancyDioInterceptor());
return d;
}