Flutter-->Namespace not specified.

server/2024/10/15 20:17:37/

更新Android gradle 7.5.0之后, 运行项目会出现Namespace not specified.问题, 这里出一个我的解决方案.

由于很多库都不可能及时更新适配gradle 7.5.0, 所以可以等pub get将子库拉取到本地之后, 在本地手动添加namespace属性,即可解决本文问题.

作为程序猿,那肯定不可能手动修改, 这种体力活是干不会的.

祭出本文干货dart脚本:

import 'dart:convert';
import 'dart:io';import 'package:yaml/yaml.dart';///
/// Email:angcyo@126.com
/// @author angcyo
/// @date 2024/10/08
///
/// 更新Gradle到7.5.0之后, 需要指定namespace属性, 不指定会报错.
/// ```
/// Namespace not specified.
/// ```
///
/// ```
/// android {
///     if (project.android.hasProperty("namespace")) {
///         namespace 'com.angcyo.xxx'
///     }
/// }
/// ```
///
/// 此脚本用于在`build.gradle`文件的`android{ ... }`中加入`namespace`属性.
///
void main() async {final currentPath = Directory.current.path;print('脚本工作路径->$currentPath');//读取yaml配置信息final localYamlFile = File("$currentPath/script.local.yaml2");final yamlFile = File("$currentPath/script.yaml2");final localYaml = loadYaml(localYamlFile.existsSync() ? localYamlFile.readAsStringSync() : "");final yaml =loadYaml(yamlFile.existsSync() ? yamlFile.readAsStringSync() : "");//---// 需要修改库的名字集合, 不指定全部// [YamlList]final names =yaml?["androidNamespaceNames"] ?? localYaml?["androidNamespaceNames"];//获取所有依赖的子库final dependenciesFile = File("$currentPath/.flutter-plugins-dependencies");final androidDependencies =jsonDecode(dependenciesFile.readAsStringSync())?["plugins"]?["android"];if (androidDependencies is List) {//{//    "name": "device_info_plus",//    "path": "/Users/angcyo/.pub-cache/hosted/pub.dev/device_info_plus-10.1.1/",//    "native_build": true,//    "dependencies": []// },int index = 0;for (final dependency in androidDependencies) {final name = dependency["name"];final path = dependency["path"];if (path != null) {if (names == null || names.contains(name)) {final namespace = getPackageFromAndroidManifest(path);if (namespace != null) {colorLog("正在添加[${index + 1}/${androidDependencies.length}]->$path -> namespace:$namespace");appendNamespace(path, namespace);} else {colorLog("未找到[package]信息, 请检查[${getAndroidManifestPath(path)}]文件.");}}}index++;}} else {colorLog("未找到子模块的依赖信息, 请检查[${dependenciesFile.path}]文件.");}
}/// 核心修改方法
/// 添加flutter子库android工程中`build.gradle`文件加入`namespace`
/// [flutterPath] flutter工程子库根路径
void appendNamespace(String flutterPath, String namespace) {final androidPath = "$flutterPath/android";final androidPathFile = File("$androidPath/build.gradle");if (androidPathFile.existsSync()) {final androidPathFileContent = androidPathFile.readAsStringSync();if (!androidPathFileContent.contains("namespace")) {//修改 android {final newContent = androidPathFileContent.replaceAllMapped(RegExp(r"android *{ *"), (match) {return 'android { \n    if (project.android.hasProperty("namespace")) namespace "$namespace" //by angcyo ${DateTime.now()}\n';});//写入文件androidPathFile.writeAsStringSync(newContent);colorLog("修改成功->$androidPathFile", 250);} else {colorLog("跳过已存在[namespace]信息 -> ${androidPathFile.path}");}}
}/// 获取AndroidManifest.xml文件路径
String getAndroidManifestPath(String flutterPath) {return "$flutterPath/android/src/main/AndroidManifest.xml";
}/// 从`AndroidManifest.xml`文件中获取`package`
String? getPackageFromAndroidManifest(String flutterPath) {final androidManifestFile = File(getAndroidManifestPath(flutterPath));if (androidManifestFile.existsSync()) {final content = androidManifestFile.readAsStringSync();final package = RegExp(r'package=\"(.*?)\"').firstMatch(content)?.group(1);return package;}return null;
}void colorLog(dynamic msg, [int col = 93]) {print('\x1B[38;5;${col}m$msg');
}

Flutter工程的任意位置, 新建一个dart文件, 粘贴上述代码, 使用dart运行main方法即可.


群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此QQ对话 该死的空格 点此快速加群

在这里插入图片描述


http://www.ppmy.cn/server/132349.html

相关文章

Oracle中处理空值函数(NVL、NVL2、NULLIF等)详解

文章目录 前言一、函数语法NVL函数NVL2函数NULLIF函数COALESCE函数DECODE函数 二、用法区别三、测试用例总结 前言 本文将介绍Oracle中处理空值的函数。常用的处理函数有:NVL()、NVL2()、NULLIF()、COALESCE()。此外DECODE()和CASE()函数也可以起到处理空值的效果。…

python爬虫题目

网站 https://project-iprj6705f17ebcfad66461658c5c-8000.preview.node01.inscode.run/ 第一道题爬取api并且保存 import requests,re import json url "https://project-iprj6705f17ebcfad66461658c5c-8000.preview.node01.inscode.run/tasks/api/" headers {us…

Redis存储时key的设置

固定值(Static Keys) 固定值的键通常用于存储那些在整个应用程序运行周期内相对不变的信息,或者是那些需要长期保存的数据。这些键通常不会因为不同的请求或用户而改变,而是代表了一种全局或静态的状态。例如: 全局配…

【计算机网络】Tcp/IP五层协议,Udp报文组成,Udp与Tcp的区别

Tcp/IP五层协议 TCP/IP模型是计算机网络的核心协议之一,通常被分为五层,每一层都有其独特的功能和作用。以下是TCP/IP模型的五层协议的简要描述: 物理层:这一层涉及实际的物理连接,定义了硬件传输介质的特性&#xff…

利用Open3D GUI开发一款点云标注工具问题总结(一)

前言 需求:利用Open3D 开发一款用于点云标注的工具,即按照点云类别赋予不同颜色 实现效果如下:通过点击颜色面板的不同颜色可以进行颜色切换,在我们选择两个点后,点击Create Box可以创建一个轴对称框体,从…

web 0基础第二节 列表标签

1.有序列表 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>有序列表 比较重要</title>…

windows使用vcpkg安装CGAL

1.1 安装 Vcpkg 第一步是vcpkg从https://github.com/microsoft/vcpkg克隆或下载。 C:\dev> git 克隆 https://github.com/microsoft/vcpkg C:\dev> cd vcpkg C:\dev\vcpkg>.\bootstrap-vcpkg.bat 1.2 使用 Vcpkg 安装 CGAL 默认情况下&#xff0c;vcpkg安装 32 位…

【三】【算法】P1007 独木桥,P1012 [NOIP1998 提高组] 拼数,P1019 [NOIP2000 提高组] 单词接龙

P1007 独木桥 独木桥 题目背景 战争已经进入到紧要时间。你是运输小队长&#xff0c;正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激&#xff0c;于是命令你的士兵们到前方的一座独木桥上欣赏风景&#xff0c;而你留在桥下欣赏士兵们。士兵们十分愤…