使用 Flutter 在 Windows 平臺開發 Android 應用

以下是完整的開發流程,包括環境搭建、代碼實現和應用發布,幫助你開發一個具有地圖顯示、TCP 通信功能的 Android 應用。

一、環境搭建

1.?安裝 Flutter SDK
  • 從?Flutter 官網?下載最新穩定版 SDK
  • 解壓到本地目錄(如?D:\flutter
  • 添加環境變量:
    • FLUTTER_ROOT = D:\flutter
    • 在?PATH?中添加?%FLUTTER_ROOT%\bin
2.?安裝 Android Studio
  • 從?官網?下載并安裝 Android Studio
  • 安裝過程中選擇安裝?Android SDKAndroid SDK Command-line Tools?和?Android Virtual Device
3.?配置 Android SDK
  • 打開 Android Studio → SDK Manager
  • 安裝?Android 11 (R)?或更高版本
  • 安裝?Google Play services?和?Google Maps Android API
4.?安裝 Flutter 和 Dart 插件
  • 在 Android Studio 中,打開?File → Settings → Plugins
  • 搜索并安裝?Flutter?和?Dart?插件
  • 重啟 Android Studio
5.?驗證環境配置

bash

flutter doctor

根據提示安裝缺失的依賴(如 Android SDK 命令行工具、啟用 USB 調試等)

二、創建 Flutter 項目

bash

flutter create map_tcp_app
cd map_tcp_app

三、添加依賴

在?pubspec.yaml?中添加以下依賴:

yaml

dependencies:flutter:sdk: fluttergoogle_maps_flutter: ^2.4.0      # 地圖組件location: ^5.0.4                 # 位置服務permission_handler: ^10.4.3      # 權限管理tcp_socket_connection: ^1.0.3    # TCP通信provider: ^6.0.5                 # 狀態管理fluttertoast: ^8.2.2             # 消息提示

運行?flutter pub get?安裝依賴。

四、配置 AndroidManifest.xml

在?android/app/src/main/AndroidManifest.xml?中添加:

xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"><!-- 添加權限 --><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><applicationandroid:label="map_tcp_app"android:icon="@mipmap/ic_launcher"><!-- 添加 Google Maps API 密鑰 --><meta-dataandroid:name="com.google.android.geo.API_KEY"android:value="YOUR_GOOGLE_MAPS_API_KEY"/><activityandroid:name=".MainActivity"android:launchMode="singleTop"android:theme="@style/LaunchTheme"android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"android:hardwareAccelerated="true"android:windowSoftInputMode="adjustResize"><!-- 確保應用可以處理深層鏈接 --><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application>
</manifest>

注意:需要替換?YOUR_GOOGLE_MAPS_API_KEY?為你在?Google Cloud Console?獲取的 API 密鑰。

五、實現地圖與 TCP 通信功能

1.?狀態管理(Provider)

創建?lib/providers/connection_provider.dart

dart

import 'package:flutter/material.dart';
import 'package:tcp_socket_connection/tcp_socket_connection.dart';class ConnectionProvider with ChangeNotifier {late TcpSocketConnection _socket;bool _isConnected = false;String _serverMessage = '';String _serverIP = '15.113.126.155';int _serverPort = 5001;ConnectionProvider() {_initSocket();}void _initSocket() {_socket = TcpSocketConnection(_serverIP, _serverPort);_socket.connect().then((status) {_isConnected = status;if (status) {_serverMessage = '已連接到服務器';_startListening();} else {_serverMessage = '連接失敗';}notifyListeners();});}void _startListening() {_socket.onMessageReceived((data) {_serverMessage = '服務器: $data';notifyListeners();});}void sendMessage(String message) {if (_isConnected) {_socket.sendMessage(message);}}void disconnect() {if (_isConnected) {_socket.disconnect();_isConnected = false;_serverMessage = '已斷開連接';notifyListeners();}}void reconnect(String ip, int port) {_serverIP = ip;_serverPort = port;disconnect();_initSocket();}bool get isConnected => _isConnected;String get serverMessage => _serverMessage;String get serverIP => _serverIP;int get serverPort => _serverPort;
}
2.?主頁面實現

修改?lib/main.dart

dart

import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:location/location.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'providers/connection_provider.dart';void main() {runApp(MultiProvider(providers: [ChangeNotifierProvider(create: (_) => ConnectionProvider()),],child: const MyApp(),),);
}

六、自定義協議實現

在?lib/utils/protocol.dart?中添加:

import 'dart:convert';
import 'dart:typed_data';class Protocol {// 協議頭標識static const int headerFlag = 0x55AA;// 構建消息包static Uint8List buildMessage(String content) {final contentBytes = utf8.encode(content);final buffer = ByteData(8 + contentBytes.length);// 設置協議頭標識buffer.setUint16(0, headerFlag, Endian.big);// 設置消息長度buffer.setUint32(2, contentBytes.length, Endian.big);// 設置消息類型 (1: 文本消息)buffer.setUint16(6, 1, Endian.big);// 設置消息內容for (int i = 0; i < contentBytes.length; i++) {buffer.setUint8(8 + i, contentBytes[i]);}return buffer.buffer.asUint8List();}// 解析消息包static String? parseMessage(Uint8List data) {if (data.length < 8) return null;final buffer = ByteData.view(data.buffer);// 驗證協議頭final flag = buffer.getUint16(0, Endian.big);if (flag != headerFlag) return null;// 獲取消息長度final length = buffer.getUint32(2, Endian.big);// 驗證數據長度if (data.length < 8 + length) return null;// 獲取消息內容final contentBytes = data.sublist(8, 8 + length);return utf8.decode(contentBytes);}
}

更新?ConnectionProvider?中的消息處理:

dart

// 在 ConnectionProvider 類中更新
void _startListening() {_socket.onMessageReceived((data) {final message = Protocol.parseMessage(Uint8List.fromList(data.codeUnits)) ?? data;_serverMessage = '服務器: $message';notifyListeners();});
}void sendMessage(String message) {if (_isConnected) {final packet = Protocol.buildMessage(message);_socket.sendMessage(String.fromCharCodes(packet));}
}

七、編譯與發布

1.?調試運行

bash

flutter run
2.?生成 Android APK

bash

flutter build apk --release

APK 文件將生成在?build/app/outputs/apk/release/app-release.apk

3.?生成 App Bundle(推薦)

bash

flutter build appbundle --release

App Bundle 文件將生成在?build/app/outputs/bundle/release/app-release.aab,可上傳至 Google Play 商店。

八、應用優化建議

  1. 錯誤處理

    • 添加網絡異常捕獲和重連機制
    • 實現超時處理(如連接超時、發送超時)
  2. UI 優化

    • 添加加載狀態指示器
    • 優化地圖標記樣式和信息窗口
  3. 性能優化

    • 使用?ListView.builder?優化消息顯示
    • 實現消息緩存機制,避免頻繁刷新
  4. 安全性

    • 考慮使用 TLS 加密 TCP 通信
    • 實現消息校驗和認證機制

通過以上步驟,你可以在 Windows 平臺使用 Android Studio 和 Flutter 開發一個完整的 Android 應用,實現地圖顯示、TCP 通信和自定義協議功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83739.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【模板】埃拉托色尼篩法(埃氏篩)

一、算法簡介 在數論與編程競賽中&#xff0c;求解 [ 1 , n ] [1,n] [1,n] 范圍內的所有質數是常見的基礎問題。埃拉托色尼篩法&#xff08;Sieve of Eratosthenes&#xff09; 是一種古老而高效的算法&#xff0c;可以在 O ( n log ? log ? n ) O(n \log \log n) O(nlogl…

AI Agent實戰 - LangChain+Playwright構建火車票查詢Agent

本篇文章將帶你一步步構建一個智能火車票查詢 Agent&#xff1a;你只需要輸入自然語言指令&#xff0c;例如&#xff1a; “幫我查一下6月15號從上海到南京的火車票” Agent就能自動理解你的需求并使用 Playwright 打開 12306 官網查詢前 10 條車次信息&#xff0c;然后匯總結果…

RabbitMQ的交換機和隊列概念

&#x1f3ea; 場景&#xff1a;一個外賣平臺的后臺系統 假設你開了一家在線外賣平臺&#xff1a; 飯店是消息的生產者&#xff08;Producer&#xff09;顧客是消息的消費者&#xff08;Consumer&#xff09;你開的外賣平臺就是RabbitMQ消息系統 &#x1f501; 第一部分&…

德國馬克斯·普朗克數學研究所:幾何朗蘭茲猜想

2025年科學突破獎 4月5日在美國洛杉磯揭曉&#xff1a;數學突破獎&#xff1a;德國馬克斯普朗克數學研究所&#xff1a;幾何朗蘭茲猜想 德國馬克斯普朗克數學研究所&#xff08;Max Planck Institute for Mathematics, MPIM&#xff09;在幾何朗蘭茲猜想的研究中扮演了核心角色…

TerraFE 腳手架開發實戰系列(一):項目架構設計與技術選型

TerraFE 腳手架開發實戰系列&#xff08;一&#xff09;&#xff1a;項目架構設計與技術選型 前言 在前端開發中&#xff0c;項目初始化往往是一個重復且繁瑣的過程。每次新建項目都需要配置 webpack、安裝依賴、設置目錄結構等&#xff0c;這些重復性工作不僅浪費時間&#…

準確--CentOS 7.9在線安裝docker

一、安裝Docker前的準備工作 操作系統版本為CentOS 7.9&#xff0c;內核版本需要在3.10以上。確保能夠連通互聯網&#xff0c;為避免網絡異常&#xff0c;建議關閉Linux的防火墻&#xff08;生產環境下請根據實際情況設置防火墻出入站規則&#xff09;。 # 查看內核版本 sudo…

中興B860AV1.1強力降級固件包

中興B860AV1.1強力降級固件包 關于中興b860av1.1頑固盒子降級教程終極版 將附件解壓好以后&#xff0c;準備一個8G以下的U盤重新格式化為FAT32格式后&#xff0c;并插入電腦 將以下文件及文件夾一同復制到優盤主目錄下&#xff08;見下圖&#xff09; 全選并復制到U盤主目錄下&…

nacos-作為注冊中心與springcloud整合(三)

前一篇文章nacos-簡介和初體驗&#xff08;一&#xff09;我們已經在服務器部署了nacos應用了。 在另外一篇文章中nacos-作為配置中心與springcloud整合&#xff08;二&#xff09;已經作為配置中心整合到springcloud 接下來讓我們嘗試把nacos作為注冊中心和springcloud中整合&…

Seata的TC(事務協調器)高可用如何實現?

Seata的TC&#xff08;事務協調器&#xff09;確實運行在Seata服務進程中&#xff0c;其高可用實現和宕機恢復主要通過以下機制實現&#xff1a; 一、高可用架構 集群部署 多TC節點組成集群&#xff0c;通過注冊中心&#xff08;如Nacos&#xff09;實現服務發現采用Raft協議實…

Mac安裝docker desktop

一、背景 最近在學習Spring AI&#xff0c;于是在GitHub上找了個開源項目&#xff0c;個人覺得還是比較適合有Java基礎和AI基礎的同學學習的。GitHub地址如下&#xff1a; https://github.com/qifan777/dive-into-spring-ai 但是看了下運行環境需要 MySQL 8 Redis-Stack n…

【算法深練】二分答案:從「猜答案」到「精準求解」的解題思路

目錄 前言 二分求最小值 1283. 使結果不超過閾值的最小除數 2187. 完成旅途的最少時間 1011. 在 D 天內送達包裹的能力 875. 愛吃香蕉的珂珂 3296. 移山所需的最少秒數 475. 供暖器 2594. 修車的最少時間 1482. 制作 m 束花所需的最少天數 3048. 標記所有下標的最早秒…

基于RK3588,飛凌教育品牌推出嵌入式人工智能實驗箱EDU-AIoT ELF 2

在AIoT技術驅動產業變革的浪潮中&#xff0c;嵌入式人工智能已成為工業物聯網、智慧交通、智慧醫療等領域創新突破的關鍵引擎。飛凌嵌入式教育品牌ElfBoard立足產業前沿&#xff0c;重磅推出嵌入式人工智能實驗箱EDU-AIoT ELF 2&#xff0c;以“軟硬協同、產教融合”為設計理念…

51單片機-IO擴展模塊 pcf8575

PCF8575介紹 PCF8575 是 NXP&#xff08;原飛利浦半導體&#xff09;生產的一款通用 IC 總線 I/O 擴展器芯片&#xff0c;主要用于微控制器&#xff08;如 Arduino、STM32 等&#xff09;的 I/O 端口擴展。 主要特性 16位并行 I/O 端口&#xff1a;可以配置為輸入或輸出 IC 總…

Python3 學習(菜鳥)-02基本數據類型

1.多變量賦值 多變量被賦予相同的數值 多變量被賦予不同的數值 2.數值運算 除法 /&#xff1a;返回一個浮點數 除法 //&#xff1a;返回一個整數 3.列表 加號和星號 加號 是列表連接運算符 星號 * 是重復操作 list [ abcd, 786 , 2.23, runoob, 70.2 ] # 定義一個…

『uniapp』搜索功能+商品列表滾動效果(詳細圖文注釋)

目錄 預覽效果準備工作代碼分析與思路1. 頁面結構主容器:`menber-container`搜索框:`u-search-inner`菜單:`u-menu-wrap`2. 數據模型`data()` 中的數據定義:3. 生命周期`onLoad(options)``onReady()``mounted()`4. 方法`search()``searchClear()``swichMenu(index)``getElRe…

微服務--消息隊列mq

1. mq簡介 消息隊列是分布式系統中的異步通信中間件&#xff0c;采用"生產者-消費者"模型實現服務間解耦通信 核心作用 服務解耦異步處理流量削峰數據同步最終一致性 消息隊列模式 發布/訂閱模式&#xff1a;一對多廣播工作隊列模式&#xff1a;競爭消費死信隊列…

第26節 Node.js 事件

Node里很多對象會分發事件&#xff1a; 每次有連接的時候net.Server會分發事件&#xff0c;當文件打開的時候fs.readStream會分發事件。所有能分發事件的對象都是 events.EventEmitter的實例。通過require("events");能訪問這個模塊。 一般來說&#xff0c;事件名都…

LangChain + MCP + vLLM + Qwen3-32B 構建本地私有化智能體應用

一、私有化智能體應用 在本專欄的前面文章基于Spring AI MCP實現了本地 ChatBI 問答應用&#xff0c;本文還是依據該場景&#xff0c;采用 LangChain vLLM Qwen3-32B MCP 技術棧構建該流程&#xff0c;整體過程如下圖所示&#xff1a; 實現效果如下所示&#xff1a; 關于 M…

AKS升級路線最佳實踐方案

前言 Kubernetes 社區大約每 4 個月發布次要版本&#xff0c;次要版本包括新增功能和改進。補丁發布更為頻繁&#xff08;有時每周都會發布&#xff09;&#xff0c;適用于次要版本中的關鍵 Bug 修復。修補程序版本包括針對安全漏洞或主要 bug 的修復。對于受支持版本列表以…

樹莓派智能小車基本移動實驗指導書

1.安裝LOBOROBOT庫函數 LOBOROBOT.py代碼如下&#xff1a; #!/usr/bin/python # -*- coding: utf-8 -*-import time import math import smbus import RPi.GPIO as GPIODir [forward,backward, ]class PCA9685:# Registers/etc.__SUBADR1 0x02__SUBADR2 …