当前位置: 首页 > article >正文

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
    }
  }
}

http://www.kler.cn/a/461764.html

相关文章:

  • node内置模块之---path 模块
  • node.js之---内置模块
  • Android 第三方框架:网络框架:OkHttp:源码分析:缓存
  • Leetcode打卡:我的日程安排表II
  • 【pytorch-lightning】架构一览
  • AcWing练习题:差
  • HTML5 标签输入框(Tag Input)详解
  • Android Studio学习笔记
  • 我的杂记一
  • 数据中心基础设施管理平台:构建高效、安全与可扩展的基石
  • OpenCV和PyQt的应用
  • 基于JavaWeb的汽车维修保养智能预约系统
  • doris 2.1 -Data Manipulation-Transaction
  • 等价和划分
  • [算法学习笔记] 《Hello算法》第5章 栈与队列
  • javaEE-文件操作和IO-文件
  • Elasticsearch:探索 Elastic 向量数据库的深度应用
  • vue2实现txt文件在线预览
  • 通过服务器推送消息:Websocket和SSE解释
  • Kafka为什么要放弃Zookeeper
  • 医疗实时数仓环境配置与ods层
  • Conda 命令教程
  • 折叠手机突然折翅,折叠屏采购暴跌,苹果挽救或是幻想
  • 一维前缀和,二维前缀和
  • 文章解读与仿真程序复现思路——EI\CSCD\北大核心《基于模型预测控制的掺氢微能源网低碳经济调度 》
  • Java Excel转PDF POI+Itext5