Commit 35fee5c6 authored by 张宏's avatar 张宏

111

parent cf1809a5
This diff is collapsed.
......@@ -5,6 +5,7 @@
# claude code
.claude/
.trae/
.idea/
.dart_tool/
build/
......
This diff is collapsed.
......@@ -2,7 +2,9 @@
<library name="Flutter Plugins" type="FlutterPluginsLibraryType">
<CLASSES>
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_secure_storage_web-1.2.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_usbcamera-0.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fluttertoast-9.0.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/share_plus-12.0.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.3" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_android-2.3.1" />
......@@ -14,22 +16,21 @@
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher-6.3.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_secure_storage_windows-3.1.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/jni_flutter-1.0.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_foundation-2.6.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_ios-6.4.1" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider-2.1.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler-11.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/vibration-3.1.8" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences-2.5.5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_android-2.4.23" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/jni-1.0.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.6" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_secure_storage-9.2.4" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/share_plus-12.0.2" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/device_info_plus-12.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler-11.4.0" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/permission_handler_html-0.1.3+5" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/vibration-3.2.0" />
</CLASSES>
<JAVADOC />
<SOURCES />
......
{
"APP_ENV": "dev",
"SERVICE_URL": "http://121.41.57.178:9090"
"SERVICE_URL": "http://121.41.173.189/laki-merchant-service"
}
{
"APP_ENV": "test",
"SERVICE_URL": "http://localhost:8080"
"SERVICE_URL": "http://121.41.173.189/laki-merchant-service"
}
......@@ -27,11 +27,17 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
emit(AuthLoading());
try {
await _authService.login(event.username, event.password);
// 新接口在登录响应中直接返回用户信息
final loginModel =
await _authService.login(event.phone, event.smsCode);
// 登录成功后获取用户信息
final userInfo = await _authService.getUserInfo();
emit(AuthSuccess(userInfo));
if (loginModel.user != null) {
emit(AuthSuccess(loginModel.user!));
} else {
// 如果登录响应中没有用户信息,则单独请求
final userInfo = await _authService.getUserInfo();
emit(AuthSuccess(userInfo));
}
} catch (e) {
emit(AuthFailure(e.toString()));
}
......@@ -45,6 +51,7 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
if (state is AuthTokenExpired || state is AuthLoggedOut) return;
await _storageService.deleteToken();
await _storageService.deleteRefreshToken();
await _storageService.deleteUserInfo();
await _storageService.deleteClientId();
emit(const AuthTokenExpired());
......@@ -60,6 +67,7 @@ class AuthBloc extends Bloc<AuthEvent, AuthState> {
// 即使接口调用失败也继续执行本地登出
}
await _storageService.deleteToken();
await _storageService.deleteRefreshToken();
await _storageService.deleteUserInfo();
await _storageService.deleteClientId();
emit(const AuthLoggedOut());
......
......@@ -8,16 +8,16 @@ abstract class AuthEvent extends Equatable {
}
class AuthLoginRequested extends AuthEvent {
final String username;
final String password;
final String phone;
final String smsCode;
const AuthLoginRequested({
required this.username,
required this.password,
required this.phone,
required this.smsCode,
});
@override
List<Object?> get props => [username, password];
List<Object?> get props => [phone, smsCode];
}
class AuthTokenExpiredEvent extends AuthEvent {
......
import 'package:equatable/equatable.dart';
import 'package:laki_icu_app/models/bo/user_info_bo.dart';
import 'package:laki_icu_app/models/bo/user_model.dart';
abstract class AuthState extends Equatable {
const AuthState();
......@@ -13,7 +13,7 @@ class AuthInitial extends AuthState {}
class AuthLoading extends AuthState {}
class AuthSuccess extends AuthState {
final UserInfoBO userInfo;
final UserModel userInfo;
const AuthSuccess(this.userInfo);
......
import 'package:equatable/equatable.dart';
import 'user_model.dart';
class LoginModel extends Equatable {
final String? accessToken;
final String? refreshToken;
final UserModel? user;
const LoginModel({
this.accessToken,
this.refreshToken,
this.user,
});
factory LoginModel.fromJson(Map<String, dynamic> json) {
return LoginModel(
accessToken: json['accessToken'] as String?,
refreshToken: json['refreshToken'] as String?,
user: UserModel.fromJson(json),
);
}
@override
List<Object?> get props => [accessToken, refreshToken, user];
}
import 'package:equatable/equatable.dart';
class UserModel extends Equatable {
final int id;
final String? nickname;
final String? phone;
final String? avatar;
final int? type;
final dynamic canControlDevice;
final dynamic canViewOperation;
final dynamic hospitalId;
final String? hospitalName;
const UserModel({
required this.id,
this.nickname,
this.phone,
this.avatar,
this.type,
this.canControlDevice,
this.canViewOperation,
this.hospitalId,
this.hospitalName,
});
factory UserModel.fromJson(Map<String, dynamic> json) {
return UserModel(
id: json['id'] as int? ?? 0,
nickname: json['nickname'] as String?,
phone: json['phone'] as String?,
avatar: json['avatar'] as String?,
type: json['type'] as int?,
canControlDevice: json['canControlDevice'],
canViewOperation: json['canViewOperation'],
hospitalId: json['hospitalId'],
hospitalName: json['hospitalName'] as String?,
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'nickname': nickname,
'phone': phone,
'avatar': avatar,
'type': type,
'canControlDevice': canControlDevice,
'canViewOperation': canViewOperation,
'hospitalId': hospitalId,
'hospitalName': hospitalName,
};
}
@override
List<Object?> get props => [
id,
nickname,
phone,
avatar,
type,
canControlDevice,
canViewOperation,
hospitalId,
hospitalName,
];
}
import '../utils/constants.dart';
import '../utils/http/response_model.dart';
import '../utils/http/dio_request.dart';
import '../models/bo/login_bo.dart';
import '../models/bo/user_info_bo.dart';
import '../models/bo/login_model.dart';
import '../models/bo/user_model.dart';
import 'mock/auth_mock_data.dart';
class AuthRepository {
Future<ResponseModel<LoginBO>> login(Map<String, dynamic> params) {
Future<ResponseModel<LoginModel>> login(
String phone, String smsCode) {
if (Constants.useMockData) {
return _mockLogin();
}
return DioRequest.instance.post<LoginBO>(
'/app/auth/login/password',
data: params,
fromJsonT: (data) => LoginBO.fromJson(data as Map<String, dynamic>),
return DioRequest.instance.post<LoginModel>(
'/merchant/account/sms-login',
data: {'phone': phone, 'smsCode': smsCode},
fromJsonT: (data) => LoginModel.fromJson(data as Map<String, dynamic>),
);
}
Future<ResponseModel<UserInfoBO>> getUserInfo() {
Future<ResponseModel<UserModel>> getUserInfo() {
if (Constants.useMockData) {
return _mockGetUserInfo();
}
return DioRequest.instance.get<UserInfoBO>(
return DioRequest.instance.get<UserModel>(
'/app/auth/user-info',
fromJsonT: (data) => UserInfoBO.fromJson(data as Map<String, dynamic>),
fromJsonT: (data) => UserModel.fromJson(data as Map<String, dynamic>),
);
}
......@@ -36,26 +37,26 @@ class AuthRepository {
// ==================== Mock 实现 ====================
Future<ResponseModel<LoginBO>> _mockLogin() async {
Future<ResponseModel<LoginModel>> _mockLogin() async {
// 模拟网络延迟,便于测试 loading 状态
await Future.delayed(const Duration(milliseconds: 500));
final loginBO = AuthMockData.mockLogin();
return ResponseModel<LoginBO>(
final loginModel = AuthMockData.mockLogin();
return ResponseModel<LoginModel>(
code: 200,
msg: '登录成功(mock)',
data: loginBO,
data: loginModel,
uuid: 'mock_uuid_${DateTime.now().millisecondsSinceEpoch}',
success: true,
timestamp: DateTime.now().millisecondsSinceEpoch,
);
}
Future<ResponseModel<UserInfoBO>> _mockGetUserInfo() async {
Future<ResponseModel<UserModel>> _mockGetUserInfo() async {
await Future.delayed(const Duration(milliseconds: 300));
final userInfo = AuthMockData.mockUserInfo();
return ResponseModel<UserInfoBO>(
return ResponseModel<UserModel>(
code: 200,
msg: '获取用户信息成功(mock)',
data: userInfo,
......
import '../../models/bo/login_bo.dart';
import '../../models/bo/user_info_bo.dart';
import '../../models/bo/login_model.dart';
import '../../models/bo/user_model.dart';
/// Auth 模块本地 mock 数据。
///
......@@ -9,31 +9,24 @@ import '../../models/bo/user_info_bo.dart';
class AuthMockData {
AuthMockData._();
/// Mock 登录响应 - 直接构造 LoginBO 实例
static LoginBO mockLogin() {
return const LoginBO(
scope: 'server',
openid: 'mock_openid_abc123',
/// Mock 登录响应 - 直接构造 LoginModel 实例
static LoginModel mockLogin() {
return LoginModel(
accessToken: 'mock_access_token_eyJhbGciOiJIUzI1NiJ9',
refreshToken: 'mock_refresh_token_xyz789',
expireIn: 86400,
refreshExpireIn: 604800,
clientId: 'mock_client_id_001',
user: mockUserInfo(),
);
}
/// Mock 用户信息响应 - 直接构造 UserInfoBO 实例
static UserInfoBO mockUserInfo() {
return const UserInfoBO(
userId: 10001,
userName: 'admin',
nickName: '管理员',
phonenumber: '13800138000',
email: 'admin@laki-icu.com',
sex: '1',
avatarUrl: 'https://qialg.com/avatar/default.png',
deptName: '技术部',
tenantId: 'tenant_001',
/// Mock 用户信息响应 - 直接构造 UserModel 实例
static UserModel mockUserInfo() {
return const UserModel(
id: 1,
nickname: '张老师',
phone: '138****0001',
avatar:
'https://qi-ai.oss-cn-hangzhou.aliyuncs.com/upload/2026/05/30/0f79ec34-ae2e-462b-a80e-2e8d46ebc145.jpg',
type: 1,
);
}
}
import '../models/bo/login_bo.dart';
import '../models/bo/user_info_bo.dart';
import '../models/bo/login_model.dart';
import '../models/bo/user_model.dart';
import '../repositories/auth_repository.dart';
import '../utils/constants.dart';
import '../utils/storage/storage_service.dart';
......@@ -14,29 +14,31 @@ class AuthService {
}) : _authRepository = authRepository,
_storageService = storageService;
Future<LoginBO> login(String username, String password) async {
final result = await _authRepository.login({
'username': username,
'password': password,
});
Future<LoginModel> login(String phone, String smsCode) async {
final result = await _authRepository.login(phone, smsCode);
if (result.success && result.data != null) {
final loginBO = result.data!;
if (loginBO.accessToken != null && loginBO.accessToken!.isNotEmpty) {
final loginModel = result.data!;
if (loginModel.accessToken != null &&
loginModel.accessToken!.isNotEmpty) {
await _storageService.saveToken(
loginBO.accessToken!,
loginModel.accessToken!,
expiryHours: Constants.tokenExpiryHours,
);
}
if (loginBO.clientId != null && loginBO.clientId!.isNotEmpty) {
await _storageService.saveClientId(loginBO.clientId!);
if (loginModel.refreshToken != null &&
loginModel.refreshToken!.isNotEmpty) {
await _storageService.saveRefreshToken(loginModel.refreshToken!);
}
return loginBO;
if (loginModel.user != null) {
await _storageService.saveUserInfo(loginModel.user!);
}
return loginModel;
}
throw Exception(result.msg);
}
Future<UserInfoBO> getUserInfo() async {
Future<UserModel> getUserInfo() async {
final result = await _authRepository.getUserInfo();
if (result.success && result.data != null) {
final userInfo = result.data!;
......@@ -46,7 +48,7 @@ class AuthService {
throw Exception(result.msg);
}
Future<UserInfoBO?> getStoredUserInfo() async {
Future<UserModel?> getStoredUserInfo() async {
return _storageService.getUserInfo();
}
......
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:laki_icu_app/models/bo/user_info_bo.dart';
import 'package:laki_icu_app/models/bo/user_model.dart';
class StorageService {
static const String _keyToken = 'auth_token';
static const String _keyTokenExpiry = 'auth_token_expiry';
static const String _keyRememberUsername = 'remember_username';
static const String _keyRememberPassword = 'remember_password';
static const String _keyRefreshToken = 'auth_refresh_token';
static const String _keyRememberPhone = 'remember_phone';
static const String _keyRememberSmsCode = 'remember_sms_code';
static const String _keyRememberEnabled = 'remember_enabled';
static const String _keyUserInfo = 'user_info';
static const String _keyClientId = 'client_id';
......@@ -51,29 +52,43 @@ class StorageService {
return token != null && token.isNotEmpty;
}
// ==================== RefreshToken 相关 ====================
Future<void> saveRefreshToken(String refreshToken) async {
await _storage.write(key: _keyRefreshToken, value: refreshToken);
}
Future<String?> getRefreshToken() async {
return await _storage.read(key: _keyRefreshToken);
}
Future<void> deleteRefreshToken() async {
await _storage.delete(key: _keyRefreshToken);
}
// ==================== 用户信息相关 ====================
Future<void> saveUserInfo(UserInfoBO userInfo) async {
Future<void> saveUserInfo(UserModel userInfo) async {
final jsonStr =
'${userInfo.userId}|${userInfo.userName}|${userInfo.nickName}|${userInfo.phonenumber}|${userInfo.email}|${userInfo.sex}|${userInfo.avatarUrl}|${userInfo.deptName}|${userInfo.tenantId}';
'${userInfo.id}|${userInfo.nickname ?? ''}|${userInfo.phone ?? ''}|${userInfo.avatar ?? ''}|${userInfo.type ?? ''}|${userInfo.canControlDevice ?? ''}|${userInfo.canViewOperation ?? ''}|${userInfo.hospitalId ?? ''}|${userInfo.hospitalName ?? ''}';
await _storage.write(key: _keyUserInfo, value: jsonStr);
}
Future<UserInfoBO?> getUserInfo() async {
Future<UserModel?> getUserInfo() async {
final value = await _storage.read(key: _keyUserInfo);
if (value == null || value.isEmpty) return null;
final parts = value.split('|');
if (parts.length < 9) return null;
return UserInfoBO(
userId: int.tryParse(parts[0]) ?? 0,
userName: parts[1],
nickName: parts[2],
phonenumber: parts[3],
email: parts[4],
sex: parts[5],
avatarUrl: parts[6],
deptName: parts[7],
tenantId: parts[8],
return UserModel(
id: int.tryParse(parts[0]) ?? 0,
nickname: parts[1].isEmpty ? null : parts[1],
phone: parts[2].isEmpty ? null : parts[2],
avatar: parts[3].isEmpty ? null : parts[3],
type: parts[4].isEmpty ? null : int.tryParse(parts[4]),
canControlDevice: parts[5].isEmpty ? null : parts[5],
canViewOperation: parts[6].isEmpty ? null : parts[6],
hospitalId: parts[7].isEmpty ? null : parts[7],
hospitalName: parts[8].isEmpty ? null : parts[8],
);
}
......@@ -98,27 +113,27 @@ class StorageService {
// ==================== 记住密码相关 ====================
Future<void> saveRememberCredentials({
required String username,
required String password,
required String phone,
required String smsCode,
}) async {
await _storage.write(key: _keyRememberUsername, value: username);
await _storage.write(key: _keyRememberPassword, value: password);
await _storage.write(key: _keyRememberPhone, value: phone);
await _storage.write(key: _keyRememberSmsCode, value: smsCode);
await _storage.write(key: _keyRememberEnabled, value: 'true');
}
Future<Map<String, String?>> getRememberCredentials() async {
final enabled = await _storage.read(key: _keyRememberEnabled);
if (enabled != 'true') {
return {'username': null, 'password': null};
return {'phone': null, 'smsCode': null};
}
final username = await _storage.read(key: _keyRememberUsername);
final password = await _storage.read(key: _keyRememberPassword);
return {'username': username, 'password': password};
final phone = await _storage.read(key: _keyRememberPhone);
final smsCode = await _storage.read(key: _keyRememberSmsCode);
return {'phone': phone, 'smsCode': smsCode};
}
Future<void> clearRememberCredentials() async {
await _storage.delete(key: _keyRememberUsername);
await _storage.delete(key: _keyRememberPassword);
await _storage.delete(key: _keyRememberPhone);
await _storage.delete(key: _keyRememberSmsCode);
await _storage.delete(key: _keyRememberEnabled);
}
......
......@@ -175,11 +175,13 @@ class _HomeIndexContentState extends State<HomeIndexContent> {
// 监控画面模块(2/3宽度、100%高度)
Expanded(
flex: 2,
child: MonitoringScreen(
onRefresh: () => _homeIndexCubit.refreshData(),
onSnapshot: () {},
onRecord: () {},
),
child: Text("1234")
// MonitoringScreen(
// onRefresh: () => _homeIndexCubit.refreshData(),
// onSnapshot: () {},
// onRecord: () {},
// ),
),
SizedBox(width: 24.w),
// 右侧(1/3宽度):患者信息卡片 + 告警信息卡片
......
......@@ -38,33 +38,33 @@ class LoginCubit extends Cubit<LoginState> {
}
void login({
required String username,
required String password,
required String phone,
required String smsCode,
bool rememberPassword = false,
}) {
if (rememberPassword) {
storageService.saveRememberCredentials(
username: username,
password: password,
phone: phone,
smsCode: smsCode,
);
} else {
storageService.clearRememberCredentials();
}
authBloc.add(AuthLoginRequested(
username: username,
password: password,
phone: phone,
smsCode: smsCode,
));
}
Future<void> loadRememberCredentials() async {
final credentials = await storageService.getRememberCredentials();
if (isClosed) return;
if (credentials['username'] != null) {
if (credentials['phone'] != null) {
emit(state.copyWith(
rememberPassword: true,
savedUsername: credentials['username'],
savedPassword: credentials['password'],
savedPhone: credentials['phone'],
savedSmsCode: credentials['smsCode'],
));
}
}
......
......@@ -4,30 +4,30 @@ class LoginState extends Equatable {
final bool rememberPassword;
final bool isLoading;
final String? error;
final String? savedUsername;
final String? savedPassword;
final String? savedPhone;
final String? savedSmsCode;
const LoginState({
this.rememberPassword = false,
this.isLoading = false,
this.error,
this.savedUsername,
this.savedPassword,
this.savedPhone,
this.savedSmsCode,
});
LoginState copyWith({
bool? rememberPassword,
bool? isLoading,
String? error,
String? savedUsername,
String? savedPassword,
String? savedPhone,
String? savedSmsCode,
}) {
return LoginState(
rememberPassword: rememberPassword ?? this.rememberPassword,
isLoading: isLoading ?? this.isLoading,
error: error,
savedUsername: savedUsername ?? this.savedUsername,
savedPassword: savedPassword ?? this.savedPassword,
savedPhone: savedPhone ?? this.savedPhone,
savedSmsCode: savedSmsCode ?? this.savedSmsCode,
);
}
......@@ -36,7 +36,7 @@ class LoginState extends Equatable {
rememberPassword,
isLoading,
error,
savedUsername,
savedPassword,
savedPhone,
savedSmsCode,
];
}
......@@ -19,8 +19,8 @@ class LoginView extends StatelessWidget {
LoginView({super.key});
final _frmGlobalKey = GlobalKey<FormState>();
final _txtUserNameController = TextEditingController();
final _txtPwdController = TextEditingController();
final _txtPhoneController = TextEditingController();
final _txtSmsCodeController = TextEditingController();
@override
Widget build(BuildContext context) {
......@@ -64,11 +64,11 @@ class LoginView extends StatelessWidget {
builder: (context, state) {
final cubit = context.read<LoginCubit>();
if (state.savedUsername != null) {
_txtUserNameController.text = state.savedUsername!;
if (state.savedPhone != null) {
_txtPhoneController.text = state.savedPhone!;
}
if (state.savedPassword != null) {
_txtPwdController.text = state.savedPassword!;
if (state.savedSmsCode != null) {
_txtSmsCodeController.text = state.savedSmsCode!;
}
return Column(
......@@ -126,11 +126,11 @@ class LoginView extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: [
UsernameField(
controller: _txtUserNameController,
controller: _txtPhoneController,
),
SizedBox(height: 20.h),
PasswordField(
controller: _txtPwdController,
controller: _txtSmsCodeController,
),
SizedBox(height: 30.h),
RememberPasswordRow(
......@@ -162,10 +162,10 @@ class LoginView extends StatelessWidget {
if (_frmGlobalKey.currentState!
.validate()) {
cubit.login(
username: _txtUserNameController.text
phone: _txtPhoneController.text
.trim(),
password:
_txtPwdController.text.trim(),
smsCode:
_txtSmsCodeController.text.trim(),
rememberPassword:
state.rememberPassword,
);
......
......@@ -7,12 +7,16 @@
#include "generated_plugin_registrant.h"
#include <flutter_secure_storage_linux/flutter_secure_storage_linux_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin");
flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar);
g_autoptr(FlPluginRegistrar) flutter_webrtc_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin");
flutter_web_r_t_c_plugin_register_with_registrar(flutter_webrtc_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
......
......@@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_linux
flutter_webrtc
url_launcher_linux
)
......
......@@ -7,6 +7,7 @@ import Foundation
import device_info_plus
import flutter_secure_storage_macos
import flutter_webrtc
import share_plus
import shared_preferences_foundation
import url_launcher_macos
......@@ -14,6 +15,7 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin"))
FlutterWebRTCPlugin.register(with: registry.registrar(forPlugin: "FlutterWebRTCPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
......
......@@ -52,6 +52,7 @@ dependencies:
permission_handler: ^11.3.1
flutter_usbcamera: ^0.0.1
path_provider: ^2.1.2
flutter_webrtc: 1.4.1
# flutter_usbcamera: ^0.0.1
# fl_chart: ^0.71.0
# fl_chart: ^1.1.0
......
......@@ -7,6 +7,7 @@
#include "generated_plugin_registrant.h"
#include <flutter_secure_storage_windows/flutter_secure_storage_windows_plugin.h>
#include <flutter_webrtc/flutter_web_r_t_c_plugin.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <share_plus/share_plus_windows_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h>
......@@ -14,6 +15,8 @@
void RegisterPlugins(flutter::PluginRegistry* registry) {
FlutterSecureStorageWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin"));
FlutterWebRTCPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FlutterWebRTCPlugin"));
PermissionHandlerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
SharePlusWindowsPluginCApiRegisterWithRegistrar(
......
......@@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST
flutter_secure_storage_windows
flutter_webrtc
permission_handler_windows
share_plus
url_launcher_windows
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment