| .vscode | ||
| android | ||
| assets | ||
| images | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| test | ||
| unity/VRProject2 | ||
| web | ||
| windows | ||
| .cursorrules | ||
| .gitattributes | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
ar_tourism_flutter_unity
1.文字渐变
ShaderMask(
shaderCallback: (Rect bounds) {
return const LinearGradient(
colors: [
Color(0xFF80DAA4),
Color(0xFF79DDED),
],
).createShader(bounds);
},
child: const Text('确定',
style: TextStyle(
color: Colors.white,
fontSize: 18)),
),
flutter打包后的文件 build/app/outputs/flutter-apk/app-debug.apk
不要忘记:online_time_service文件修改ws部署地址
ndroid/app/src/main/res/xml 目录下创建 network_security_config.xml 文件:创建网络安全配置文件82.156.153.112
flutter run --release 运行打包文件
flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi 可以减小打包体积
flutter build apk
使用flutter analyze命令检查代码中的潜在问题,确保没有冗余的代码和依赖。
git大文件上传报错 https://blog.csdn.net/qq_22903677/article/details/138123394
git lfs install git add . git commit -m ""
git push报错
错误batch response: LFS only supported repository in paid or trial enterpri rm .git/hooks/pre-push git push -u origin "master"
#接口调用 import '../../apis/app.dart'; userApi.getLoginCode(data).then((result) { if (result['code'] == 200) { print("发送成功"); Navigator.pushNamed(context, '/tabs'); } else { print("发送失败"); } });
formData 上传文件
// 构建实名认证信息对象 var infoMsg = { "user_name": _phoneController.text, "real_name": _nameController.text, "id_card": _idCardController.text }; // 将 infoMsg 转换为 JSON 字符串 var infoMsgJson = jsonEncode(infoMsg); // 获取文件对象 File frontFile = File(_frontImage!.path); print("frontFile: $frontFile"); File backFile = File(_backImage!.path); print("backFile: $backFile");
// 创建 FormData
FormData formData = FormData.fromMap({
"cardFront": await MultipartFile.fromFile(frontFile.path,
filename: "card_front.png"),
"cardBack": await MultipartFile.fromFile(backFile.path,
filename: "card_back.png"),
"realNameAuthenticationDto": infoMsgJson, // 添加 JSON 字符串
});
print("请求数据: $formData");
// 调用实名认证API
userApi.getRealNameAuth(formData).then((result) {
if (result['code'] == 200) {
print("实名认证成功");
// 跳转到认证成功页面
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const AuthSuccessPage(),
),
);
}
});
格式化时间
String _formatDateTime(String dateTimeString) { DateTime dateTime = DateTime.parse(dateTimeString).toLocal(); return '${dateTime.year}-${dateTime.month}-${dateTime.day} ${dateTime.hour}:${dateTime.minute}:${dateTime.second}'; // 格式化为 年月日 时分秒 }
跳转到底部导航页
Navigator.pushNamedAndRemoveUntil( context, '/tabs', (route) => false, arguments: {'initialIndex': 1}, // 传递参数,设置初始选中的tab );
集成unity
1.baseProjectTemplate.gradle文件 classpath 'com.android.tools.build:gradle:7.3.0', classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.0" 2.NDK版本21.3
#运行清除缓存 adb shell pm clear com.example.ar_tourism_flutter_unity
unityLibrary 文件夹
1.添加.so文件 src/main/jniLibs/arm64-v8a/libEasyAR.so libc++_shared.so
每次从unity 导入flutter时要检查:
1.unity--->Player Company Name: com.example Product Name: ar_tourism_flutter_unity 2.unity--> build Settings Export Project 勾选;IL2CPP Code Generation:Faster(smaller)builds 3.unity--> Player -->otherSettings OpenGLES3下都取消勾选 Auto Graphics API 勾选 4.unity--> Player -->otherSettings Package Name:com.example.ar_tourism_flutter_unity 5.unity--> Player -->Minimum APl Level:Android 5.1 'Lollipop'(APl level 22);Target APl Level:APllevel 34 6.unity--> Player -->Scripting Backend:IL2CPP 勾选ARM64 7.unity-->Project Settings-->EasyAR/Sence EasyAR Sence License Key:URzW8VUPzu1NaWbUsPbv6VUBDY95e6AyZGz+imEu4NpVPubHYTPxii5/tJAnabCYJWWynSIdtJ4nc+bHeX+pink89txxL87NbRThii5sqYp4NObNei7g2zZn3tM2P/DGcDHg4XAup5JPAKmKYjz3wXUz8ds2Z96KdzLoxWEz7Nxtf9iENi3pyWA76tp5LqeST3/ywXo56t9nf6mKeTzmiklxp8V7OfDEcS6nkk9/9s16LuCGXTDkz3EJ98l3NuzGc3+pimc469txc8bEeyjh+nE+6s96NPHBezOnhDYu4MZnOKv6cT7q2nA06882cafbcTP2zToS58JxPvH8Zjzmw30z4oo4f/bNei7ghkco9851PuD8Zjzmw30z4oo4f/bNei7ghkct5NpnONbYdSnsyXgQ5Ng2cafbcTP2zToQ6tx9Muv8Zjzmw30z4oo4f/bNei7ghlA469txDvXJYDTkxFk89Yo4f/bNei7ghlccwfxmPObDfTPiiklxp81sLezacQnsxXEO8cl5LaeSeijpxDh/7NtYMubJeH+/znUx9s1pcf6KdijrzHg4zMxnf7/zNj7qxTo4/cl5LenNOjz392Ay8Np9Luj3cjHw3GA49/dhM+zcbX/YhDYr5Np9POvcZ3+/8zY+6sV5KOvBYCSn9Th/9cR1KePHZjD2ii4Gp8l6OffHfTmn9Th/6MdwKOnNZ3+/8zYu4MZnOKvheTzizUAv5Mt/NOvPNnGn23Ez9s06HunHYTnXzXcy4sZ9KezHen+pimc469txc9fNdzL3zH0z4oo4f/bNei7ghls/7813KdHadT7uwXo6p4Q2LuDGZzir+2Ev48l3ONHadT7uwXo6p4Q2LuDGZzir+2Q899txDvXJYDTkxFk89Yo4f/bNei7ghlky8cF7M9HadT7uwXo6p4Q2LuDGZzir7HEz9s1HLeTcfTzp5XUtp4Q2LuDGZzir61UZ0dp1Pu7Bejqn9Th/4NBkNPfNQDTozUcp5MVkf7/GYTHphDY09uR7PuTENmfjyXgu4NU4JqfKYTPhxHEU4ds2Z96KNgCpimI898F1M/HbNmfeincy6MVhM+zcbX/YhDYt6clgO+raeS6nkk9/7Mdnf9iENjDqzGEx4Ns2Z96KZzjr23FzzMV1OuD8Zjzmw30z4oo4f/bNei7ghlcx6t1wD+DLezrrwWA06sY2cafbcTP2zToP4Mt7L+HBejqnhDYu4MZnOKvndjfgy2AJ98l3NuzGc3+pimc469txc9bdZjvky3EJ98l3NuzGc3+pimc469txc9bYdS/2zUct5Nx9POnldS2nhDYu4MZnOKvleynsx3oJ98l3NuzGc3+pimc469txc8HNei7g+2Q88cF1McjJZH+pimc469txc8bpUAn3yXc27MZzf9iENjj92H0v4Px9MOD7YDzo2DZn6914MamKfS7Jx3c86YouO+TEZzj49WkSI2M48hCn8PXdlAW8gkVUod0xa+37dOiHJxzEZnb9Yo3mYzP6LHO7eF7u11thk3qJcxk7MRjQFuOc+9AjiOyoEoW+vErOoVFolgphuBc4A2Q05Nd1hEFpx/3xG0ZbuQS5+Uo0hNtfZAiKmM+1XFy9KD3wXluPLXmrZC916jAjwZgp2p0nbsiJEvj57xlXrA7F+IRuCMrgMMav+zdcrMuUAN/8ANbYqXlj6T86dgZqSmkI22nX6P1lYbGJTb0YkvMPDLYaBK5TPfzqnZkb6m647L82gb7nzVCPvLOucFjVAjMG0kwF2xBJ+aEIFbNUBsLN3Dq8YPT4n0I5+SwUXYWo (此key为EasyAR申请 名字和key要对应)
因购买EASY AR 使用unity中的即可 无需替换
8.Player-->publishing Settings-->build下的都勾选 9.MyCamera-->GPS勾选
版本更新
1.修改yaml中的版本号 2.修改Android/app/build.gradle中的版本号versionName versionCode 3.打包将apk 文件拷贝到服务器上
Flutter与Unity之间的交互说明
核心文件说明
FlutterMainActivity 专注处理Flutter相关的逻辑和生命周期 UnityMainActivity 专注处理Unity相关的渲染和交互 这种分离使得代码更清晰,维护更容易
1. FlutterMainActivity.kt
这是Flutter应用的主Activity文件,主要功能包括:
- 负责Flutter和Unity之间的桥接通信
- 管理Unity的初始化和启动
- 处理权限请求和结果
- 提供方法通道(MethodChannel)供Flutter调用原生方法
- 管理位置服务的生命周期
- 处理Unity活动的返回结果
主要方法:
configureFlutterEngine: 配置Flutter引擎和方法通道startUnityActivity: 启动Unity活动checkAndRequestPermissions: 检查和请求必要权限cleanupLocationService: 清理位置服务资源
2. UnityMainActivity.kt
这是Unity应用的主Activity文件,主要功能包括:
- 继承自UnityPlayerActivity,负责Unity内容的显示和控制
- 管理Unity播放器的生命周期
- 处理Unity和Flutter之间的数据传递
- 提供Unity返回Flutter的机制
- 处理Unity资源的清理和释放
主要方法:
onCreate: 初始化Unity环境和方法通道setupMethodChannel: 设置与Flutter通信的方法通道handleExitUnity: 处理Unity退出逻辑onBackPressed: 处理返回按键事件
交互流程
- Flutter通过MethodChannel调用FlutterMainActivity中的方法
- FlutterMainActivity处理请求并启动UnityMainActivity
- UnityMainActivity加载Unity内容并处理Unity相关的操作
- Unity操作完成后,通过UnityMainActivity返回结果给FlutterMainActivity
- FlutterMainActivity将结果通过MethodChannel传回Flutter
注意事项
-
两个Activity之间的通信需要严格管理生命周期
-
Unity资源的加载和释放需要合理处理,避免内存泄漏
-
权限请求和结果处理需要完整的错误处理机制
-
位置服务的启动和停止需要在合适的时机进行
-
Activity切换时需要确保资源的正确释放和重新初始化
iOS
包名:com.example.arTourismFlutterUnity