Flutter中进行多平台开发的ip设置
Flutter中进行多平台开发的ip设置(根据平台选择不同的配置)
在 Android 模拟器中,10.0.2.2 是一个特殊的 IP 地址,它指向你的电脑(主机)的 localhost。
如未修改前使用
class ApiService {
final Dio _dio = Dio(BaseOptions(
baseUrl: 'http://localhost:10005',
));
那么使用安卓模拟器时需要修改为
class ApiService {
final Dio _dio = Dio(BaseOptions(
baseUrl: 'http://10.0.2.2:51476',
));
网络环境差异:
在电脑上,localhost 或 127.0.0.1 指向本机
在 Android 模拟器中,localhost 指向模拟器自己
10.0.2.2 是 Android 模拟器用来访问主机 localhost 的特殊 IP
端口映射关系:
电脑上的服务: localhost:51476
Android模拟器访问: 10.0.2.2:51476
不同环境的配置:
// Android 模拟器
baseUrl: 'http://10.0.2.2:51476'
// 真机调试(需要使用实际IP)
baseUrl: 'http://192.168.1.100:51476' // 你电脑的局域网IP
// Web开发
baseUrl: 'http://localhost:51476'
我的案例
D:\F\luichun\ 我的项目
D:\F\luichun\lib\utils\ 自定义多功能工具库文件夹
D:\F\luichun\lib\utils\env_config.dart
当其它文件中需要引用本地ip端口时,直接使用导入
import '../utils/env_config.dart';// 这里引用根据环境来获取不同的url
class ApiService {
final Dio _dio = Dio(BaseOptions(
// 这是本机后端的地址与端口,但是,运行在不同环境中,需要根据环境配置来选择
// baseUrl: 'http://localhost:10005',
baseUrl: EnvConfig.apiBaseUrl,
D:\F\luichun\lib\utils\env_config.dart 文件中的配置:
import 'package:flutter/foundation.dart';
import 'dart:convert';
/// 环境配置管理类
/// 用于处理不同平台、不同环境下的配置项
///
/// 主要功能:
/// 1. 根据运行平台自动选择正确的API地址
/// 2. 区分开发环境和生产环境
/// 3. 判断是否在模拟器上运行
/// 4. 处理图片URL在不同环境下的访问
class EnvConfig {
/// 获取当前环境的API基础URL
///
/// 根据不同条件返回不同的URL:
/// - Web环境: http://localhost:10005
/// - Android模拟器: http://10.0.2.2:10005
/// - Android生产环境: https://api.yourserver.com
/// - iOS模拟器: http://localhost:10005
/// - iOS生产环境: https://api.yourserver.com
///
/// [kIsWeb]: 判断是否是Web环境
/// [defaultTargetPlatform]: 判断运行平台(Android/iOS等)
/// [kReleaseMode]: 判断是否是发布模式
static String get apiBaseUrl {
if (kIsWeb) {
// Web环境下使用localhost
return 'http://localhost:10005';
} else if (defaultTargetPlatform == TargetPlatform.android) {
if (!kReleaseMode) {
// Android模拟器开发环境,使用10.0.2.2访问主机
return 'http://10.0.2.2:10005';
} else {
// Android生产环境使用实际的服务器地址
return 'https://api.yourserver.com';
}
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
if (!kReleaseMode) {
// iOS模拟器开发环境
return 'http://localhost:10005';
} else {
// iOS生产环境使用实际的服务器地址
return 'https://api.yourserver.com';
}
}
// 其他平台默认使用localhost
return 'http://localhost:10005';
}
/// 判断是否是开发环境
///
/// 通过 [kReleaseMode] 判断:
/// - true: 生产环境
/// - false: 开发环境
static bool get isDevelopment => !kReleaseMode;
/// 判断是否在模拟器上运行
///
/// 条件:
/// 1. 是开发环境 (!kReleaseMode)
/// 2. 平台是Android或iOS
static bool get isEmulator => !kReleaseMode &&
(defaultTargetPlatform == TargetPlatform.android ||
defaultTargetPlatform == TargetPlatform.iOS);
/// 处理图片URL,根据不同环境返回正确的地址
///
/// 功能:
/// 1. 检查URL是否是http开头
/// 2. 在Android模拟器环境下将localhost替换为10.0.2.2
/// 3. 提供开发环境下的调试信息
///
/// 参数:
/// - [url]: 原始图片URL
///
/// 返回:
/// - 处理后的URL字符串
/// - 出错时返回原始URL
static String getImageUrl(String url) {
try {
if (!url.startsWith('http')) return url;
// 在开发环境打印原始URL
if (isDevelopment) {
print('Processing URL: $url');
}
// 仅在 Android 模拟器环境下替换 localhost
if (defaultTargetPlatform == TargetPlatform.android && !kReleaseMode) {
final newUrl = url.replaceFirst('localhost', '10.0.2.2');
if (isDevelopment) {
print('Modified URL: $newUrl');
}
return newUrl;
}
return url;
} catch (e) {
if (isDevelopment) {
print('Error processing URL: $e');
print('Original URL: $url');
}
return url; // 出错时返回原始URL
}
}
}