diff --git a/lib/main.dart b/lib/main.dart index 0658138..77d2484 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:suwon/viewmodels/AccountRecoveryVM.dart'; +import 'package:suwon/viewmodels/ChattingVM.dart'; import 'package:suwon/viewmodels/LoginVM.dart'; import 'package:suwon/viewmodels/SignupVM.dart'; // 추가: SignupViewModel 임포트 import 'package:suwon/views/LoginScreen.dart'; @@ -21,6 +22,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider( create: (context) => SignupVM()), // 추가: SignupViewModel 제공 ChangeNotifierProvider(create: (context) => AccountRecoveryVM()), + ChangeNotifierProvider(create: (context) => ChatViewModel()), ], child: MaterialApp( debugShowCheckedModeBanner: false, diff --git a/lib/models/chat_model.dart b/lib/models/chat_model.dart new file mode 100644 index 0000000..52c6db1 --- /dev/null +++ b/lib/models/chat_model.dart @@ -0,0 +1,23 @@ +class Message { + final String roomId; + final String sender; + final String contents; + + Message({required this.roomId, required this.sender, required this.contents}); + + factory Message.fromJson(Map json) { + return Message( + roomId: json['roomId'], + sender: json['sender'], + contents: json['contents'], + ); + } + + Map toJson() { + return { + 'roomId': roomId, + 'sender': sender, + 'contents': contents, + }; + } +} diff --git a/lib/models/user_model.dart b/lib/models/user_model.dart index e195b26..5376f71 100644 --- a/lib/models/user_model.dart +++ b/lib/models/user_model.dart @@ -1,8 +1,8 @@ class UserModel { - final String memberId, password, email, nickname; + final String account, password, email, nickname; UserModel.fromJson(Map json) - : memberId = json["memberId"], + : account = json["account"], password = json["password"], email = json["email"], nickname = json["nickname"]; diff --git a/lib/viewmodels/ChattingVM.dart b/lib/viewmodels/ChattingVM.dart new file mode 100644 index 0000000..8803107 --- /dev/null +++ b/lib/viewmodels/ChattingVM.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:stomp_dart_client/stomp.dart'; +import 'package:stomp_dart_client/stomp_config.dart'; +import 'package:stomp_dart_client/stomp_frame.dart'; +import 'dart:convert'; +import 'package:suwon/models/chat_model.dart'; + +class ChatViewModel extends ChangeNotifier { + StompClient? client; + String serverUrl = 'ws://3.35.83.91:8080/stomp'; + String sendEndpoint = '/pub/chat/message/1234'; + List chatMessages = []; + + ChatViewModel() { + client = StompClient( + config: StompConfig( + url: serverUrl, + onConnect: onConnect, + onWebSocketError: (dynamic error) => print(error.toString()), + ), + ); + } + + void initialize() { + client!.activate(); + } + + void onConnect(StompFrame frame) { + client!.subscribe( + destination: '/sub/chat/room/1234', + callback: (StompFrame frame) { + if (frame.body != null) { + Map jsonData = json.decode(frame.body!); + Message message = Message.fromJson(jsonData); + chatMessages.add(message); + notifyListeners(); // 새로운 메시지가 추가될 때마다 호출 + } + }, + ); + } + + void sendMessage(String message) { + client!.send( + destination: sendEndpoint, + body: json.encode( + Message(roomId: '1234', sender: 'your_name', contents: message) + .toJson()), + ); + } +} diff --git a/lib/viewmodels/Chatting_Viewmodel.dart b/lib/viewmodels/Chatting_Viewmodel.dart deleted file mode 100644 index c45f1fa..0000000 --- a/lib/viewmodels/Chatting_Viewmodel.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ChatViewModel extends ChangeNotifier { - bool isChatButtonEnabled = false; - - void updateChatButtonState(String text) { - // 입력된 문자열이 하나라도 있는 경우 버튼 활성화 - isChatButtonEnabled = text.isNotEmpty; - notifyListeners(); - } -} diff --git a/lib/viewmodels/LoginVM.dart b/lib/viewmodels/LoginVM.dart index 2f8933d..0dbae9a 100644 --- a/lib/viewmodels/LoginVM.dart +++ b/lib/viewmodels/LoginVM.dart @@ -25,7 +25,7 @@ class LoginVM extends ChangeNotifier { try { final apiUrl = Uri.parse('http://3.35.83.91:8080/member/sign-in'); final requestBody = { - "memberId": _userid, + "account": _userid, "password": _userpw, }; diff --git a/lib/viewmodels/SignupVM.dart b/lib/viewmodels/SignupVM.dart index fddcb1d..708764e 100644 --- a/lib/viewmodels/SignupVM.dart +++ b/lib/viewmodels/SignupVM.dart @@ -4,13 +4,12 @@ import 'package:suwon/models/user_model.dart'; import 'dart:convert'; class SignupVM extends ChangeNotifier { - String _id = ''; - String _password = ''; - String _email = ''; - String _nickname = ''; - String _mbti = ''; - String _self = ''; //자기소개 + String id = ''; + String password = ''; + String email = ''; + String nickname = ''; + bool btActivation = true; bool _idError = false; bool _pwError = false; bool _emailError = false; @@ -40,6 +39,7 @@ class SignupVM extends ChangeNotifier { void validateIdInput(String value) { if (value.length >= 4 && value.length <= 16) { _idError = false; + btActivation = false; } else { _idError = true; } @@ -49,6 +49,7 @@ class SignupVM extends ChangeNotifier { void validatePwInput(String value) { if (value.length >= 6 && value.length <= 20) { _pwError = false; + btActivation = false; } else { _pwError = true; } @@ -56,10 +57,11 @@ class SignupVM extends ChangeNotifier { } void validatePwMatch(String value) { - if (pwController.text != value) { - _pwMatch = true; - } else { + if (pwController.text == value) { _pwMatch = false; + btActivation = false; + } else { + _pwMatch = true; } notifyListeners(); } @@ -67,6 +69,7 @@ class SignupVM extends ChangeNotifier { void validateNickNameInput(String value) { if (value.length < 9) { _nicknameError = false; + btActivation = false; } else { _nicknameError = true; } @@ -83,6 +86,14 @@ class SignupVM extends ChangeNotifier { notifyListeners(); } + void truebt(btActivation) { + if (_idError && _pwError && _pwMatch && _nicknameError == false) { + btActivation = false; + } else { + btActivation = true; + } + } + bool validateEmail(String value) { final RegExp emailRegExp = RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$'); @@ -93,16 +104,16 @@ class SignupVM extends ChangeNotifier { Future signup(UserModel userModel) async { try { - // Convert UserModel to JSON - Map userJson = { - "id1": userModel.memberId, - "password1!": userModel.password, - "valent9": userModel.email, - "n1": userModel.nickname, + // Convert UserModel to Map + Map userMap = { + "account": userModel.account, + "password": userModel.password, + "email": userModel.email, + "nickname": userModel.nickname, }; - // Encode JSON to String - String body = json.encode(userJson); + // Encode Map to JSON String + String signupData = json.encode(userMap); // Make a POST request to your backend API final response = await http.post( @@ -110,9 +121,11 @@ class SignupVM extends ChangeNotifier { headers: { 'Content-Type': 'application/json', }, - body: body, + body: signupData, ); + print(userMap); + // 응답 상태 확인 if (response.statusCode == 200) { // 회원가입 성공 시, 필요한 경우 응답을 처리 diff --git a/lib/views/ChattingScreen.dart b/lib/views/ChattingScreen.dart index b087443..c6bf8a9 100644 --- a/lib/views/ChattingScreen.dart +++ b/lib/views/ChattingScreen.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:provider/provider.dart'; import 'package:suwon/views/HomeScreen.dart'; +import 'package:suwon/viewmodels/ChattingVM.dart'; class RandomChat extends StatefulWidget { const RandomChat({Key? key}); @@ -11,7 +13,14 @@ class RandomChat extends StatefulWidget { } class _RandomChatState extends State { - bool isChatEnabled = false; + late ChatViewModel viewModel; + + @override + void initState() { + super.initState(); + viewModel = Provider.of(context, listen: false); + viewModel.initialize(); + } @override Widget build(BuildContext context) { @@ -23,27 +32,21 @@ class _RandomChatState extends State { height: 812.h, child: Column( children: [ - header(), + _Header(), Expanded( child: SingleChildScrollView( child: Column( - children: [ - // Add your chat messages here - ], + children: viewModel.chatMessages + .map( + (message) => _ChatBubble(message: message.contents)) + .toList(), ), ), ), Container( padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 24.w), height: 58.h, - child: CustomTextField( - hintText: '채팅을 시작해 보세요 . . .', - onIconTap: (isEnabled) { - setState(() { - isChatEnabled = isEnabled; - }); - }, - ), + child: _CustomTextField(viewModel: viewModel), ), ], ), @@ -51,8 +54,59 @@ class _RandomChatState extends State { ), ); } +} + +class _CustomTextField extends StatefulWidget { + final ChatViewModel viewModel; + + _CustomTextField({Key? key, required this.viewModel}) : super(key: key); + + @override + _CustomTextFieldState createState() => _CustomTextFieldState(); +} + +class _CustomTextFieldState extends State<_CustomTextField> { + final TextEditingController _textController = TextEditingController(); + + @override + Widget build(BuildContext context) { + return TextField( + controller: _textController, + decoration: InputDecoration( + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(20), + ), + hintText: '채팅을 시작하세요...', + hintStyle: TextStyle( + color: Color(0xff737373), + fontFamily: 'Pretendard-Regular', + fontSize: 16.sp, + fontWeight: FontWeight.w400, + ), + contentPadding: EdgeInsets.only(left: 17.w, top: 12, bottom: 12), + suffixIcon: GestureDetector( + onTap: () { + String message = _textController.text; + if (message.isNotEmpty) { + widget.viewModel.sendMessage(message); + _textController.clear(); + } + }, + child: SvgPicture.asset( + 'assets/onchatbt.svg', + width: 40.w, + height: 40.h, + ), + ), + ), + ); + } +} - Widget header() { +class _Header extends StatelessWidget { + @override + Widget build(BuildContext context) { + final chattingViewModel = Provider.of(context); return Container( height: 128.h, alignment: Alignment.bottomCenter, @@ -71,7 +125,7 @@ class _RandomChatState extends State { ), SizedBox(width: 12.w), Text( - 'nickname', + '닉네임', style: TextStyle( fontFamily: 'KCCChassam', fontSize: 22.sp, @@ -84,11 +138,6 @@ class _RandomChatState extends State { ), SizedBox(width: 95.w), GestureDetector( - onTap: isChatEnabled - ? null - : () { - onPressed(); - }, child: SvgPicture.asset( 'assets/Report button.svg', width: 40.w, @@ -113,59 +162,25 @@ class _RandomChatState extends State { ), ); } - - void onPressed() { - // 버튼이 클릭되었을 때의 동작을 정의합니다. - } } -class CustomTextField extends StatefulWidget { - final String hintText; - final Function(bool) onIconTap; - - CustomTextField({required this.hintText, required this.onIconTap}); +class _ChatBubble extends StatelessWidget { + final String message; - @override - _CustomTextFieldState createState() => _CustomTextFieldState(); -} - -class _CustomTextFieldState extends State { - bool isInputEmpty = true; + const _ChatBubble({Key? key, required this.message}) : super(key: key); @override Widget build(BuildContext context) { - return TextField( - onChanged: (text) { - setState(() { - isInputEmpty = text.isEmpty; - }); - widget.onIconTap(isInputEmpty); - }, - decoration: InputDecoration( - border: OutlineInputBorder( - borderRadius: BorderRadius.circular(20), - ), - hintText: widget.hintText, - hintStyle: TextStyle( - color: Color(0xff737373), - fontFamily: 'Pretendard-Regular', - fontSize: 16.sp, - fontWeight: FontWeight.w400, - ), - contentPadding: EdgeInsets.only(left: 17.w, top: 12, bottom: 12), - suffixIcon: GestureDetector( - onTap: () { - setState(() { - isInputEmpty = !isInputEmpty; - }); - widget.onIconTap(isInputEmpty); - }, - child: SvgPicture.asset( - isInputEmpty ? 'assets/offchatbt.svg' : 'assets/onchatbt.svg', - width: 40.w, - height: 40.h, - ), - ), + return Container( + padding: EdgeInsets.all(8), + margin: EdgeInsets.symmetric(vertical: 4), + decoration: BoxDecoration( + color: Colors.lightBlueAccent, + borderRadius: BorderRadius.circular(10), + ), + child: Text( + message, + style: TextStyle(color: Colors.white), ), ); } diff --git a/lib/views/EmailAuthentication.dart b/lib/views/EmailAuthentication.dart index 05c9f37..32f8691 100644 --- a/lib/views/EmailAuthentication.dart +++ b/lib/views/EmailAuthentication.dart @@ -1,7 +1,16 @@ -/*import 'package:flutter/material.dart'; +import 'dart:convert'; + +import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:suwon/models/user_model.dart'; import 'package:suwon/viewmodels/SignupVM.dart'; import 'package:provider/provider.dart'; +import 'package:suwon/views/LoginScreen.dart'; +import 'package:suwon/views/SignUpScreen.dart'; +import 'package:suwon/views/widgets/CustomButtonWidget.dart'; +import 'package:suwon/views/widgets/EmailTextFieldWidget.dart'; +import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; +import 'package:suwon/views/widgets/TextFontWidget.dart'; class EmailAuth extends StatelessWidget { const EmailAuth({super.key}); @@ -16,7 +25,6 @@ class EmailAuth extends StatelessWidget { body: Container( margin: EdgeInsets.only(top: 88.h), child: Form( - key: _formKey, child: Column( children: [ Container( @@ -25,14 +33,10 @@ class EmailAuth extends StatelessWidget { child: SuchatAppBarWidget( text: ' 회원가입', onPressed: () { - signupViewModel.idController.clear(); - signupViewModel.pwController.clear(); - signupViewModel.pwMatchController.clear(); - signupViewModel.emailController.clear(); Navigator.push( context, MaterialPageRoute( - builder: (context) => LoginScreen(), + builder: (context) => SignUpScreen(), ), ); }, @@ -46,102 +50,74 @@ class EmailAuth extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - IdInputFD(), - SizedBox(height: 44.h), - PwInputFD( - labelText: '비밀번호', - showErrorText: signupViewModel.pwError, - errorText: '* 6자 이상 20자 이내로 작성해 주세요', - obscureText: signupViewModel.passwordVisible1, - controller: signupViewModel.pwController, - onChanged: (value) => - signupViewModel.validatePwInput(value), - hintText: '비밀번호 입력 (문자, 숫자 포함 6~20자)', - onPressed: () { - signupViewModel.togglePasswordVisibility1(); - }, - icon: signupViewModel.passwordVisible1 - ? Icons.visibility_off - : Icons.visibility, - ), - SizedBox(height: 18.h), - PwInputFD( - labelText: '비밀번호 확인', - showErrorText: signupViewModel.pwMatch, - errorText: '* 비밀번호가 일치하지 않습니다.', - obscureText: signupViewModel.passwordVisible2, - controller: signupViewModel.pwMatchController, - onChanged: (value) => - signupViewModel.validatePwMatch(value), - hintText: '비밀번호 입력 (문자, 숫자 포함 6~20자)', - onPressed: () { - signupViewModel.togglePasswordVisibility2(); - }, - icon: signupViewModel.passwordVisible2 - ? Icons.visibility_off - : Icons.visibility, - ), - SizedBox(height: 46.h), + SizedBox(height: 35.h), EmailTextFieldWidget( controller: signupViewModel.emailController, onChanged: (value) => signupViewModel.isEmailValid), SizedBox(height: 57.h), - CustomButtonWidget( - text: '다음', - color: Colors.white, - backgroundColor: Color(0xFF111111), - onPressed: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - SignUpDoneScreen()), - ); - }), - SizedBox( - height: 14.h, - ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ TextFontWidget.fontSemiBold( - text: '회원가입 시 ', + text: '* 입력하신 메일로 ', fontSize: 12.sp, color: Color(0xFF989898), ), - GestureDetector( - onTap: () { - // 버튼이 클릭되었을 때 실행될 코드 - }, - child: TextFontWidget.fontSemiBold( - text: '서비스 이용약관', - fontSize: 12.sp, - color: Color(0xFF2D64D8), - ), + TextFontWidget.fontSemiBold( + text: '이메일 인증 URL ', + fontSize: 12.sp, + color: Color(0xff2d63d8), ), TextFontWidget.fontSemiBold( - text: ' 및 ', + text: '을 전송합니다', fontSize: 12.sp, color: Color(0xFF989898), ), - GestureDetector( - onTap: () { - // 버튼이 클릭되었을 때 실행될 코드 - }, - child: TextFontWidget.fontSemiBold( - text: '개인정보 처리방침', - fontSize: 12.sp, - color: Color(0xFF2D64D8), - ), - ), ], ), - TextFontWidget.fontSemiBold( - text: '하신 것으로 간주됩니다', - fontSize: 12.sp, - color: Color(0xFF989898), + SizedBox(height: 10.h), + CustomButtonWidget( + text: '인증메일 전송', + color: Colors.white, + backgroundColor: Color(0xff2d63d8), + onPressed: () async { + // 사용자 입력을 JSON 형식으로 변환합니다 + String jsonData = json.encode({ + "memberId": signupViewModel.idController.text, + "password": signupViewModel.pwController.text, + "email": signupViewModel.emailController.text, + "nickname": + signupViewModel.nicknameController.text, + }); + + // UserModel.fromJson 생성자를 사용하여 UserModel 객체를 만듭니다 + UserModel userModel = + UserModel.fromJson(json.decode(jsonData)); + + // UserModel 객체와 함께 signup 메서드를 호출합니다 + await signupViewModel.signup(userModel); + }, + ), + SizedBox( + height: 15.h, ), + CustomButtonWidget( + text: '회원가입 완료', + color: Colors.white, + backgroundColor: Color(0xFF111111), + onPressed: () { + signupViewModel.idController.clear(); + signupViewModel.pwController.clear(); + signupViewModel.pwMatchController.clear(); + signupViewModel.emailController.clear(); + signupViewModel.nicknameController.clear(); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => LoginScreen()), + ); + }), ], ), ), @@ -154,4 +130,3 @@ class EmailAuth extends StatelessWidget { ); } } -*/ \ No newline at end of file diff --git a/lib/views/LoginScreen.dart b/lib/views/LoginScreen.dart index 4afb300..91fae1b 100644 --- a/lib/views/LoginScreen.dart +++ b/lib/views/LoginScreen.dart @@ -1,3 +1,5 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:suwon/views/ChangePasswordScreen.dart'; @@ -7,6 +9,7 @@ import 'package:suwon/views/SignUpScreen.dart'; import 'package:suwon/views/widgets/CustomButtonWidget.dart'; import 'package:provider/provider.dart'; import 'package:suwon/viewmodels/LoginVM.dart'; +import 'package:suwon/views/widgets/NormalAlertDialogWidget.dart'; import 'package:suwon/views/widgets/TextFontWidget.dart'; import 'SearchPasswordScreen.dart'; @@ -71,6 +74,12 @@ class LoginScreen extends StatelessWidget { MaterialPageRoute( builder: (context) => HomeScreen()), ); + } else { + NormalAlertDialogWidget( + title: '알림', + message: 'ID 혹은 비밀번호가 올바르지 않습니다.', + onClose: () {}) + .show(context); } }), Row( diff --git a/lib/views/Random_chat.dart b/lib/views/RandomChatScreen.dart similarity index 100% rename from lib/views/Random_chat.dart rename to lib/views/RandomChatScreen.dart diff --git a/lib/views/SignUpScreen.dart b/lib/views/SignUpScreen.dart index 93c75cd..97402c7 100644 --- a/lib/views/SignUpScreen.dart +++ b/lib/views/SignUpScreen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:suwon/views/EmailAuthentication.dart'; import 'package:suwon/views/LoginScreen.dart'; import 'package:suwon/views/SignUpDoneScreen.dart'; import 'package:suwon/views/widgets/SuchatAppBarWidget.dart'; @@ -71,7 +72,7 @@ class SignUpScreen extends StatelessWidget { hintText: '닉네임 입력', controller: signupViewModel.nicknameController, showErrorText: signupViewModel.nicknameError, - errorText: '이미 사용중인 닉네임 입니다.', + errorText: '8자 이내로 작성해 주세요', onChanged: (value) => signupViewModel.validateNickNameInput(value), onPressed: () {}, @@ -114,16 +115,16 @@ class SignUpScreen extends StatelessWidget { CustomButtonWidget( text: '다음', color: Colors.white, - backgroundColor: Color(0xFF111111), - onPressed: () { - signupViewModel.signup; - Navigator.push( + backgroundColor: signupViewModel.btActivation + ? Colors.grey + : Color(0xFF111111), + onPressed: () async {}), + + /* Navigator.push( context, MaterialPageRoute( - builder: (context) => - SignUpDoneScreen()), - ); - }), + builder: (context) => EmailAuth()), + );*/ SizedBox( height: 14.h, ), diff --git a/lib/views/widgets/CustomButtonWidget.dart b/lib/views/widgets/CustomButtonWidget.dart index cc7f6a0..6d61e9f 100644 --- a/lib/views/widgets/CustomButtonWidget.dart +++ b/lib/views/widgets/CustomButtonWidget.dart @@ -7,6 +7,7 @@ class CustomButtonWidget extends StatelessWidget { final VoidCallback onPressed; final Border? border; final Color color; + final bool? isEnabled; const CustomButtonWidget({ required this.text, @@ -14,6 +15,7 @@ class CustomButtonWidget extends StatelessWidget { required this.onPressed, required this.color, this.border, + this.isEnabled, }); @override diff --git a/pubspec.lock b/pubspec.lock index 2870386..73718ad 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -115,6 +123,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: "0aa7409f6c82acfab96853b8b0c7503de49918cbe705a57cfdeb477756b4521b" + url: "https://pub.dev" + source: hosted + version: "4.1.0" lints: dependency: transitive description: @@ -208,6 +224,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.11.1" + stomp_dart_client: + dependency: "direct main" + description: + name: stomp_dart_client + sha256: "10ecb6255a95eec78c3b064512fc8700cd2af9506cedafe3694e9662773dd1d5" + url: "https://pub.dev" + source: hosted + version: "1.0.3" stream_channel: dependency: transitive description: @@ -288,6 +312,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" xml: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 7a6e226..d3a5333 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,6 +38,12 @@ dependencies: http: ^1.2.0 + stomp_dart_client: ^1.0.3 + + json_annotation: ^4.0.1 + + + # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2