新增网络可视化请求工具
This commit is contained in:
+19
-1
@@ -3,10 +3,14 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_ume/flutter_ume.dart';
|
||||
import 'package:flutter_ume_kit_device/components/device_info/device_info_panel.dart';
|
||||
import 'package:flutter_ume_kit_dio/flutter_ume_kit_dio.dart';
|
||||
import 'package:recording_tool/app/app.dart';
|
||||
import 'package:recording_tool/app/config/app_config.dart';
|
||||
import 'package:recording_tool/core/cache/app_storage.dart';
|
||||
import 'package:recording_tool/core/logging/app_logger.dart';
|
||||
import 'package:recording_tool/core/network/app_dio.dart';
|
||||
import 'package:recording_tool/core/platform/app_platform_info.dart';
|
||||
|
||||
class AppBootstrapper {
|
||||
@@ -25,7 +29,21 @@ class AppBootstrapper {
|
||||
|
||||
AppLogger.debug('App started in ${AppConfig.current.environment.name}');
|
||||
|
||||
runApp(const ProviderScope(child: FlutterTemplateApp()));
|
||||
// 注册 UME 调试插件(DioInspector 需与业务共用同一 Dio 实例)
|
||||
PluginManager.instance
|
||||
..register(DioInspector(dio: AppDio.instance))
|
||||
..register(DeviceInfoPanel());
|
||||
|
||||
runApp(
|
||||
UMEWidget(
|
||||
enable: true,
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
children: [const ProviderScope(child: FlutterTemplateApp())],
|
||||
),
|
||||
),
|
||||
);
|
||||
// runApp(const ProviderScope(child: FlutterTemplateApp()));
|
||||
|
||||
// Load native package metadata after the first frame can render.
|
||||
// Awaiting MethodChannel calls before runApp() can stall the Android
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:recording_tool/app/config/app_config.dart';
|
||||
|
||||
/// 应用全局 Dio 单例,供业务请求与调试插件共用。
|
||||
class AppDio {
|
||||
AppDio._();
|
||||
|
||||
static Dio? _instance;
|
||||
|
||||
static Dio get instance {
|
||||
return _instance ??= Dio(
|
||||
BaseOptions(
|
||||
baseUrl: AppConfig.current.baseUrl,
|
||||
connectTimeout: const Duration(seconds: 30),
|
||||
receiveTimeout: const Duration(seconds: 30),
|
||||
sendTimeout: const Duration(seconds: 30),
|
||||
responseType: ResponseType.json,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -2,36 +2,36 @@ import 'package:dio/dio.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:recording_tool/app/config/app_config.dart';
|
||||
import 'package:recording_tool/core/network/api_client.dart';
|
||||
import 'package:recording_tool/core/network/app_dio.dart';
|
||||
import 'package:recording_tool/core/network/header_interceptor.dart';
|
||||
import 'package:recording_tool/core/network/offline_queue/offline_queue_interceptor.dart';
|
||||
import 'package:recording_tool/core/network/providers/network_providers.dart';
|
||||
import 'package:recording_tool/core/network/providers/offline_queue_providers.dart';
|
||||
|
||||
bool _dioConfigured = false;
|
||||
|
||||
final dioProvider = Provider<Dio>((ref) {
|
||||
final dio = Dio(
|
||||
BaseOptions(
|
||||
baseUrl: AppConfig.current.baseUrl,
|
||||
connectTimeout: const Duration(seconds: 30),
|
||||
receiveTimeout: const Duration(seconds: 30),
|
||||
sendTimeout: const Duration(seconds: 30),
|
||||
responseType: ResponseType.json,
|
||||
),
|
||||
);
|
||||
final dio = AppDio.instance;
|
||||
|
||||
dio.interceptors.add(HeaderInterceptor());
|
||||
if (!_dioConfigured) {
|
||||
_dioConfigured = true;
|
||||
dio.interceptors.add(HeaderInterceptor());
|
||||
|
||||
final monitor = ref.watch(networkMonitorProvider);
|
||||
final queueManager = ref.watch(offlineQueueManagerProvider);
|
||||
dio.interceptors.add(
|
||||
OfflineQueueInterceptor(
|
||||
monitor: monitor,
|
||||
manager: queueManager,
|
||||
enabled: false,
|
||||
),
|
||||
);
|
||||
final monitor = ref.read(networkMonitorProvider);
|
||||
final queueManager = ref.read(offlineQueueManagerProvider);
|
||||
dio.interceptors.add(
|
||||
OfflineQueueInterceptor(
|
||||
monitor: monitor,
|
||||
manager: queueManager,
|
||||
enabled: false,
|
||||
),
|
||||
);
|
||||
|
||||
if (AppConfig.current.enableNetworkLog) {
|
||||
dio.interceptors.add(LogInterceptor(requestBody: true, responseBody: true));
|
||||
if (AppConfig.current.enableNetworkLog) {
|
||||
dio.interceptors.add(
|
||||
LogInterceptor(requestBody: true, responseBody: true),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return dio;
|
||||
|
||||
@@ -87,37 +87,36 @@ class _AuthPageWidgetState extends ConsumerState<AuthPageWidget> {
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20.h),
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w),
|
||||
child: Column(
|
||||
children: [
|
||||
AppTextField(controller: _controller),
|
||||
SizedBox(height: 20.h),
|
||||
SizedBox(
|
||||
width: double.maxFinite,
|
||||
child: AppButton(
|
||||
label: '获取设备码',
|
||||
onPressed: () async {
|
||||
final deviceCode = await DeviceUtils.deviceCode();
|
||||
if (mounted) {
|
||||
AppDialog.confirm(
|
||||
context,
|
||||
title: '设备码',
|
||||
message: deviceCode,
|
||||
);
|
||||
}
|
||||
;
|
||||
},
|
||||
variant: AppButtonVariant.secondary,
|
||||
isLoading: authState.isLoading,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
..._buildTestArea(authState.isLoading),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 测试区域
|
||||
List<Widget> _buildTestArea(bool isLoading) {
|
||||
return [
|
||||
SizedBox(height: 20.h),
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20.w),
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
width: double.maxFinite,
|
||||
child: AppButton(
|
||||
label: '获取设备码',
|
||||
onPressed: () async {
|
||||
DeviceUtils.deviceCode().then((code) {
|
||||
AppDialog.confirm(context, title: '设备码', message: code);
|
||||
});
|
||||
},
|
||||
variant: AppButtonVariant.secondary,
|
||||
isLoading: isLoading,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user