1
This commit is contained in:
27
build.dev.sh
27
build.dev.sh
@@ -1 +1,26 @@
|
|||||||
flutter build apk -Penv=dev
|
#!/bin/bash
|
||||||
|
|
||||||
|
#当前执行目录
|
||||||
|
current_dir=$(pwd)
|
||||||
|
channelPath="$current_dir/build/app/outputs/apk/dev"
|
||||||
|
mkdir -p "$channelPath"
|
||||||
|
rm -rf "$channelPath"/*
|
||||||
|
#定义环境变量和 Android 设备品牌
|
||||||
|
declare -a APP_CHANNELS=("dev")
|
||||||
|
|
||||||
|
# 遍历每个环境配置并执行构建
|
||||||
|
for index in "${APP_CHANNELS[@]}"; do
|
||||||
|
ENV=${APP_CHANNELS[$index]}
|
||||||
|
flutter build apk -Penv=dev -Pchannel=$ENV --dart-define=ENV=dev
|
||||||
|
# 检查构建是否成功
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Build failed for ENV=$ENV"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
apkFile=$(find $(pwd)/build/app/outputs/apk/release/ -name "*.apk" -print -quit)
|
||||||
|
# 获取 .apk 文件的文件名
|
||||||
|
apkFileName=$(basename "$apkFile")
|
||||||
|
mv $apkFile "$channelPath/$apkFileName"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "All builds completed successfully."
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ declare -a APP_CHANNELS=("release")
|
|||||||
# 遍历每个环境配置并执行构建
|
# 遍历每个环境配置并执行构建
|
||||||
for index in "${APP_CHANNELS[@]}"; do
|
for index in "${APP_CHANNELS[@]}"; do
|
||||||
ENV=${APP_CHANNELS[$index]}
|
ENV=${APP_CHANNELS[$index]}
|
||||||
flutter build apk -Penv=prod -Pchannel=$ENV
|
flutter build apk -Penv=prod -Pchannel=$ENV --dart-define=ENV=prod
|
||||||
# 检查构建是否成功
|
# 检查构建是否成功
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "Build failed for ENV=$ENV"
|
echo "Build failed for ENV=$ENV"
|
||||||
|
|||||||
@@ -8,19 +8,24 @@ class Config {
|
|||||||
///获取接口地址
|
///获取接口地址
|
||||||
static String baseUrl() {
|
static String baseUrl() {
|
||||||
if (getEnv() == 'dev') {
|
if (getEnv() == 'dev') {
|
||||||
return 'https://xueguang.test.tuzuu.com/api';
|
return 'https://xg.test.lifebanktech.com/api';
|
||||||
} else {
|
} else {
|
||||||
return 'https://xueguang.test.tuzuu.com/api';
|
return 'https://xg.lifebanktech.com/api';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 获取websocket地址
|
/// 获取websocket地址
|
||||||
static String wsUrl() {
|
static String wsUrl() {
|
||||||
return "wss://xueguang.test.tuzuu.com/ws";
|
final url = webUrl();
|
||||||
|
final wsBase = url.replaceAll('https', 'wss'); // 替换协议
|
||||||
|
return '$wsBase/ws';
|
||||||
}
|
}
|
||||||
|
|
||||||
///网页域名地址
|
///网页域名地址
|
||||||
static String get webUrl => "http://xueguang.test.tuzuu.com";
|
static String webUrl() {
|
||||||
|
String url = baseUrl();
|
||||||
|
return url.replaceAll("/api", "");
|
||||||
|
}
|
||||||
|
|
||||||
///声网APPid
|
///声网APPid
|
||||||
static String get swAppId => "011c2fd2e1854511a80c1aebded4eee7";
|
static String get swAppId => "011c2fd2e1854511a80c1aebded4eee7";
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:app/global/event_bus.dart';
|
import 'package:app/global/event_bus.dart';
|
||||||
import 'package:app/providers/user_store.dart';
|
import 'package:app/providers/user_store.dart';
|
||||||
import 'package:app/router/route_paths.dart';
|
import 'package:app/router/route_paths.dart';
|
||||||
|
import 'package:app/widgets/version/version_dialog.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
@@ -12,7 +12,6 @@ import 'package:go_router/go_router.dart';
|
|||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'global/theme/theme.dart';
|
import 'global/theme/theme.dart';
|
||||||
import 'global/theme/themes/light_theme.dart';
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
runApp(
|
runApp(
|
||||||
@@ -43,6 +42,13 @@ class _MyAppState extends State<MyApp> {
|
|||||||
ctx?.go(RoutePaths.login);
|
ctx?.go(RoutePaths.login);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
///延迟
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
final ctx = navigatorKey.currentState?.context;
|
||||||
|
showUpdateDialog(ctx!);
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class _LoginPageState extends State<LoginPage> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
///点击发送验证码
|
///点击发送验证码
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:app/global/theme/base/app_theme_ext.dart';
|
import 'package:app/global/theme/base/app_theme_ext.dart';
|
||||||
import 'package:app/pages/student/home/viewmodel/s_home_vm.dart';
|
import 'package:app/pages/student/home/viewmodel/s_home_vm.dart';
|
||||||
import 'package:app/widgets/version/version_dialog.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'widgets/tip_card.dart';
|
import 'widgets/tip_card.dart';
|
||||||
@@ -13,7 +12,6 @@ class SHomePage extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
showUpdateDialog(context);
|
|
||||||
return ChangeNotifierProvider(
|
return ChangeNotifierProvider(
|
||||||
create: (_) => SHomeVm(),
|
create: (_) => SHomeVm(),
|
||||||
child: _HomeView(),
|
child: _HomeView(),
|
||||||
|
|||||||
@@ -54,15 +54,18 @@ class TeacherVideo extends StatelessWidget {
|
|||||||
Positioned(
|
Positioned(
|
||||||
top: 30,
|
top: 30,
|
||||||
left: 10,
|
left: 10,
|
||||||
child: Container(
|
child: Visibility(
|
||||||
width: 200,
|
visible: !vm.cameraClose,
|
||||||
color: Colors.black,
|
child: Container(
|
||||||
child: AspectRatio(
|
width: 200,
|
||||||
aspectRatio: 16 / 9,
|
color: Colors.black,
|
||||||
child: AgoraVideoView(
|
child: AspectRatio(
|
||||||
controller: VideoViewController(
|
aspectRatio: 16 / 9,
|
||||||
rtcEngine: vm.engine!,
|
child: AgoraVideoView(
|
||||||
canvas: const VideoCanvas(uid: 0),
|
controller: VideoViewController(
|
||||||
|
rtcEngine: vm.engine!,
|
||||||
|
canvas: const VideoCanvas(uid: 0),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ class StuRoomVM extends ChangeNotifier {
|
|||||||
//启动连接
|
//启动连接
|
||||||
await _ws.connect();
|
await _ws.connect();
|
||||||
//
|
//
|
||||||
|
_sub?.cancel();
|
||||||
_sub = _ws.stream.listen((msg) {
|
_sub = _ws.stream.listen((msg) {
|
||||||
//自习室人员变化,同时也设置房间是否开了
|
//自习室人员变化,同时也设置房间是否开了
|
||||||
if (msg.event == RoomEvent.changeUser) {
|
if (msg.event == RoomEvent.changeUser) {
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ class THomePage extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
// showUpdateDialog(context);
|
|
||||||
return ChangeNotifierProvider(
|
return ChangeNotifierProvider(
|
||||||
create: (_) => HomeViewModel(),
|
create: (_) => HomeViewModel(),
|
||||||
child: const _HomeView(),
|
child: const _HomeView(),
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import 'dart:io';
|
|||||||
import 'package:app/global/config.dart';
|
import 'package:app/global/config.dart';
|
||||||
import 'package:app/request/api/room_api.dart';
|
import 'package:app/request/api/room_api.dart';
|
||||||
import 'package:app/request/websocket/room_protocol.dart';
|
import 'package:app/request/websocket/room_protocol.dart';
|
||||||
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:logger/logger.dart';
|
import 'package:logger/logger.dart';
|
||||||
|
|
||||||
import '../dto/room/rtc_token_dto.dart';
|
import '../dto/room/rtc_token_dto.dart';
|
||||||
@@ -51,7 +52,6 @@ class RoomWebSocket {
|
|||||||
_socket = await WebSocket.connect(
|
_socket = await WebSocket.connect(
|
||||||
"${Config.wsUrl()}?token=$wsToken&study_room_id=$roomId",
|
"${Config.wsUrl()}?token=$wsToken&study_room_id=$roomId",
|
||||||
);
|
);
|
||||||
logger.i("连接成功");
|
|
||||||
_reconnectTimer?.cancel();
|
_reconnectTimer?.cancel();
|
||||||
_reconnectTimer = null;
|
_reconnectTimer = null;
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ class RoomWebSocket {
|
|||||||
},
|
},
|
||||||
onDone: () {},
|
onDone: () {},
|
||||||
onError: (_) {
|
onError: (_) {
|
||||||
logger.e("连接异常断开");
|
EasyLoading.showError("连接断开");
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
//自动加入房间
|
//自动加入房间
|
||||||
@@ -88,7 +88,6 @@ class RoomWebSocket {
|
|||||||
send(RoomCommand.ping);
|
send(RoomCommand.ping);
|
||||||
});
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.e("连接失败");
|
|
||||||
_reconnect();
|
_reconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,7 +109,7 @@ class RoomWebSocket {
|
|||||||
void _reconnect() {
|
void _reconnect() {
|
||||||
_reconnectTimer?.cancel();
|
_reconnectTimer?.cancel();
|
||||||
_reconnectTimer = Timer.periodic(Duration(seconds: 3), (timer) {
|
_reconnectTimer = Timer.periodic(Duration(seconds: 3), (timer) {
|
||||||
logger.e("正在重连");
|
EasyLoading.showToast("正在重连中");
|
||||||
connect();
|
connect();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -121,11 +120,10 @@ class RoomWebSocket {
|
|||||||
_heartbeatTimer = null;
|
_heartbeatTimer = null;
|
||||||
//socket取消
|
//socket取消
|
||||||
_socket?.close();
|
_socket?.close();
|
||||||
// 销毁事件流
|
|
||||||
// _msgController.close();
|
|
||||||
// 错误重连取消
|
// 错误重连取消
|
||||||
_reconnectTimer?.cancel();
|
_reconnectTimer?.cancel();
|
||||||
_reconnectTimer = null;
|
_reconnectTimer = null;
|
||||||
|
|
||||||
logger.i("websocket销毁成功");
|
logger.i("websocket销毁成功");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class BoardDialog extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _BoardDialogState extends State<BoardDialog> {
|
class _BoardDialogState extends State<BoardDialog> {
|
||||||
bool _loading = true;
|
bool _loading = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|||||||
@@ -55,12 +55,12 @@ class BoardManager {
|
|||||||
"write": isTeacher ? 1 : 0,
|
"write": isTeacher ? 1 : 0,
|
||||||
};
|
};
|
||||||
String paramStr = params.entries.map((e) => "${e.key}=${e.value}").join("&");
|
String paramStr = params.entries.map((e) => "${e.key}=${e.value}").join("&");
|
||||||
|
return "${Config.webUrl()}/board?$paramStr";
|
||||||
return "${Config.webUrl}/board?$paramStr";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 获取全局唯一 WebViewController
|
/// 获取全局唯一 WebViewController
|
||||||
Future<WebViewController> getController(String url) async {
|
Future<WebViewController> getController(String url) async {
|
||||||
|
print(url);
|
||||||
if (_webViewController != null) return _webViewController!;
|
if (_webViewController != null) return _webViewController!;
|
||||||
|
|
||||||
_webViewController = WebViewController()
|
_webViewController = WebViewController()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ name: app
|
|||||||
description: "A new Flutter project."
|
description: "A new Flutter project."
|
||||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
|
|
||||||
version: 1.1.1
|
version: 1.1.3
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.8.1
|
sdk: ^3.8.1
|
||||||
|
|||||||
Reference in New Issue
Block a user