From 8ddcfe7f27ab44835645bc1929cb0575f90b9ea4 Mon Sep 17 00:00:00 2001 From: ss3un9 Date: Wed, 28 Jun 2023 05:26:37 +0900 Subject: [PATCH] feat : img_network --- android/app/src/debug/AndroidManifest.xml | 2 + android/app/src/main/AndroidManifest.xml | 3 +- android/app/src/profile/AndroidManifest.xml | 2 + lib/models/rdiary_model.dart | 8 +-- lib/providers/diaries_provider.dart | 49 ++++++++++++++++-- lib/providers/generate_provider.dart | 13 +++-- lib/screens/Bookmarks.dart | 2 +- lib/screens/ai_writeDiary.dart | 2 + lib/screens/diaries.dart | 2 +- lib/screens/exchange_diary.dart | 2 +- lib/screens/exchange_diary_detail.dart | 31 +++++++++--- lib/screens/exchange_diary_edit.dart | 27 ++++++++-- lib/screens/generate_diary.dart | 27 ++++++++-- lib/widgets/comment_widget.dart | 30 ++++++++--- lib/widgets/diary_card.dart | 56 ++++++++++++++++----- lib/widgets/diary_modal_card.dart | 32 ++++++++++-- lib/widgets/exchange_diary_card.dart | 29 +++++++++-- lib/widgets/exchange_diary_modal.dart | 2 +- 18 files changed, 257 insertions(+), 62 deletions(-) diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 2230135..a2f3bbd 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -5,4 +5,6 @@ to allow setting breakpoints, to provide hot reload, etc. --> + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8dd3dfc..d6ffe31 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,7 +6,8 @@ - + + + + diff --git a/lib/models/rdiary_model.dart b/lib/models/rdiary_model.dart index 0bcaa34..4db3b62 100644 --- a/lib/models/rdiary_model.dart +++ b/lib/models/rdiary_model.dart @@ -3,7 +3,7 @@ import 'package:sumday/screens/ai_writeDiary.dart'; class Diary { String userID; - List context, tags, photos; + List context, tags, images; DateTime date; bool favorite; @@ -11,7 +11,7 @@ class Diary { required this.userID, required this.date, required this.tags, - required this.photos, + required this.images, required this.context, required this.favorite, }); @@ -21,7 +21,7 @@ class Diary { date = json['date'].toDate(), tags = json['tags'].cast(), context = json["context"].cast(), - photos = json["photos"].cast(), + images = json["photos"].cast(), favorite = json['favorite']; Map toJson() => { @@ -29,7 +29,7 @@ class Diary { "date": date, "tags": tags, "context": context, - "photos": photos, + "photos": images, "favorite": favorite, }; diff --git a/lib/providers/diaries_provider.dart b/lib/providers/diaries_provider.dart index 5e56116..34b3bb4 100644 --- a/lib/providers/diaries_provider.dart +++ b/lib/providers/diaries_provider.dart @@ -47,7 +47,7 @@ class DiariesProvider with ChangeNotifier { // 일기 추가 // docName : 일반적으로 저장할 때는 null 주면 됨, 삭제 복구할 때는 값 줘야함 - Future addDiary(int index, Diary diary, String? docName) async { + Future insertDiary(int index, Diary diary, String? docName) async { print(index); diaries.insert(index, diary); var docName0 = await _saveDiary(diary, docName); @@ -58,6 +58,20 @@ class DiariesProvider with ChangeNotifier { return docName0; } + Future addDiary(Diary diary, String? docName) async { + if (!diaries.contains(diary)) { + diaries.add(diary); + var docName0 = await _saveDiary(diary, docName); + + docNames.add(docName0); + _numOfDiaries++; + notifyListeners(); + return docName0; + } + final idx = diaries.indexOf(diary); + return docNames[idx]; + } + // 일기 업데이트 // docName : 일반적으로 저장할 때는 null 주면 됨, 삭제 복구할 때는 값 줘야함 Future UpdateDiary(int index, Diary diary, String? docName) async { @@ -122,19 +136,20 @@ class DiariesProvider with ChangeNotifier { final uuid = generateUuid(); final fileName = '$uuid.png'; - final imageRef = FirebaseStorage.instance.ref().child(fileName); + final imageRef = FirebaseStorage.instance.ref().child('images/$fileName'); await imageRef.putData(imageBytes); fileNames.add(fileName); + + saveImageToStorage(imgUrl, fileName); } return fileNames; } // 내부 저장소에 이미지 저장 - Future saveImageToStorage(String url) async { + Future saveImageToStorage(String url, String uuid) async { var response = await http.get(Uri.parse(url)); final Uint8List bytes = response.bodyBytes; - final uuid = generateUuid(); Directory dir = await getApplicationDocumentsDirectory(); String filePath = '${dir.path}/$uuid.png'; @@ -142,5 +157,31 @@ class DiariesProvider with ChangeNotifier { File file = File(filePath); await file.writeAsBytes(bytes); print('이미지 저장 경로: $filePath'); + print('추가 경로 : ${getApplicationDocumentsDirectory()}'); } + + // 내부 저장소에서 이미지 불러오기 + Future loadImageFromStorage(String filePath) async { + File file = File(filePath); + Uint8List bytes = await file.readAsBytes(); + return bytes; + } + + Future getImageUrl(String imageName) async { + FirebaseStorage storage = FirebaseStorage.instance; + + // Here we assume that the images are stored in a directory named 'images'. + // You should replace this with the actual path to your images. + return storage.ref().child('images/$imageName').getDownloadURL(); + print('images/$imageName'); + + // try { + // String url = await ref.getDownloadURL(); + // print(url); + // return url; + // } catch (e) { + // print(e); + // return 'null'; + // } } +} \ No newline at end of file diff --git a/lib/providers/generate_provider.dart b/lib/providers/generate_provider.dart index 2e644ff..a0fe6a0 100644 --- a/lib/providers/generate_provider.dart +++ b/lib/providers/generate_provider.dart @@ -32,6 +32,11 @@ class GenerateProvider with ChangeNotifier { int get PageValue => _pageValue; double get sliderValue => _sliderValue; + List? get getAllImageUrl => _imageUrl; + List? get getAllKoSummary => _koSummary; + + bool get isAllGen => + _isTextGen!.every((e) => e) && _isImageGen!.every((e) => e); List? get isTextGen => _isTextGen; List? get isPhotoGen => _isImageGen; @@ -89,7 +94,7 @@ class GenerateProvider with ChangeNotifier { } String getPrompt(UserForm data) { - return '${data.userState} ${data.activity} ${data.relation} ${data.location} ${data.category}'; + return '${data.userState} ${data.activity} ${data.relation} ${data.location}'; } String getKoSummary(int index) { @@ -125,7 +130,7 @@ class GenerateProvider with ChangeNotifier { var data = _dataList![index]; var prompt = getPrompt(data); - print(prompt); + print('$prompt'); final response = await http.post( Uri.parse(apiUrl), @@ -168,7 +173,7 @@ class GenerateProvider with ChangeNotifier { if (!_isImageGen![index]) { final openai = OpenaiDalleWrapper(apiKey: apiKey); String url = await openai - .generateImage("${_enSummary![index]}, a painting of illustration"); + .generateImage(_enSummary![index] + ", a painting of illustration"); print(url); _setImgUrl(index, url); _setImageGen(index); @@ -199,4 +204,4 @@ class GenerateProvider with ChangeNotifier { //print(newresponse['choices'][0]['text'].trim()); return newresponse['choices'][0]['text'].trim(); } -} +} \ No newline at end of file diff --git a/lib/screens/Bookmarks.dart b/lib/screens/Bookmarks.dart index 4141c2c..3a85d3b 100644 --- a/lib/screens/Bookmarks.dart +++ b/lib/screens/Bookmarks.dart @@ -41,7 +41,7 @@ class _BookmarksState extends State { action: SnackBarAction( label: '취소', onPressed: () { - diariesProvider.addDiary(index, diary, docName); + diariesProvider.insertDiary(index, diary, docName); }, ), ), diff --git a/lib/screens/ai_writeDiary.dart b/lib/screens/ai_writeDiary.dart index a772c72..e575e23 100644 --- a/lib/screens/ai_writeDiary.dart +++ b/lib/screens/ai_writeDiary.dart @@ -43,6 +43,8 @@ class _Ai_WriteDiaryState extends State { final sortedLocationList = locationList.reversed.toList().sublist(0, min(3, locationList.length)); List dataList = widget.dataList; + print('aaaa $sortedLocationList'); + print(widget.pageIndex); return Center( child: ListView( children: [ diff --git a/lib/screens/diaries.dart b/lib/screens/diaries.dart index a3d4510..923f6b8 100644 --- a/lib/screens/diaries.dart +++ b/lib/screens/diaries.dart @@ -41,7 +41,7 @@ class _DiariesState extends State { action: SnackBarAction( label: '취소', onPressed: () { - diariesProvider.addDiary(index, diary, docName); + diariesProvider.insertDiary(index, diary, docName); }, ), ), diff --git a/lib/screens/exchange_diary.dart b/lib/screens/exchange_diary.dart index 8ec67ba..a84c75b 100644 --- a/lib/screens/exchange_diary.dart +++ b/lib/screens/exchange_diary.dart @@ -243,7 +243,7 @@ class _ExchangeDiaryState extends State { .context[ current], photos: todayDiaries - .photos[ + .images[ current], tags: todayDiaries .getCurrTags( diff --git a/lib/screens/exchange_diary_detail.dart b/lib/screens/exchange_diary_detail.dart index cec8dd0..ad79bc2 100644 --- a/lib/screens/exchange_diary_detail.dart +++ b/lib/screens/exchange_diary_detail.dart @@ -2,6 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sumday/models/comment_model.dart'; +import 'package:sumday/providers/diaries_provider.dart'; import 'package:sumday/providers/exchange_diary_list_provider.dart'; import 'package:sumday/providers/loginProvider.dart'; import 'package:sumday/utils/variables.dart'; @@ -12,13 +13,14 @@ class ExchangeDiaryDetail extends StatefulWidget { final int idx; final String diaryId; final String content; - final List comments; + List comments; final List tags; final String location; final DateTime date; final String writer; final String photo; - const ExchangeDiaryDetail({ + + ExchangeDiaryDetail({ super.key, required this.idx, required this.diaryId, @@ -112,13 +114,28 @@ class _ExchangeDiaryDetailState extends State { ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(10)), - child: Image.asset( - "assets/${widget.photo}", - width: double.maxFinite, + child: FutureBuilder( + future: + Provider.of(context, listen: false) + .getImageUrl(widget.photo), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return SizedBox( + height: 10, + width: 10, + child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Image.network(snapshot.data!,width: double.maxFinite, height: 185, fit: BoxFit.fitWidth, - alignment: Alignment.center, - ), + alignment: Alignment.center,); + } + }, + ) ), const SizedBox( height: 20, diff --git a/lib/screens/exchange_diary_edit.dart b/lib/screens/exchange_diary_edit.dart index c25aa6d..324ea0c 100644 --- a/lib/screens/exchange_diary_edit.dart +++ b/lib/screens/exchange_diary_edit.dart @@ -2,6 +2,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:sumday/models/exchange_diary_model.dart'; +import 'package:sumday/providers/diaries_provider.dart'; import 'package:sumday/providers/exchange_diary_list_provider.dart'; import 'package:sumday/screens/exchange_diary_detail.dart'; import 'package:sumday/utils/variables.dart'; @@ -125,13 +126,29 @@ class _ExchangeDiaryEditPageState extends State { children: [ ClipRRect( borderRadius: BorderRadius.circular(8.0), - child: Image.asset( - "assets/${widget.diary.photos}", - width: 185, + child: FutureBuilder( + future: + Provider.of(context, listen: false) + .getImageUrl(widget.diary.photos), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return SizedBox( + height: 10, + width: 10, + child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Image.network(snapshot.data!, + width: 185, height: 185, fit: BoxFit.fill, - alignment: Alignment.center, - ), + alignment: Alignment.center,); + } + }, + ), ), const SizedBox( height: 30, diff --git a/lib/screens/generate_diary.dart b/lib/screens/generate_diary.dart index 91c4fdf..aa38a64 100644 --- a/lib/screens/generate_diary.dart +++ b/lib/screens/generate_diary.dart @@ -49,7 +49,7 @@ class _GenerateDiaryState extends State { @override Widget build(BuildContext context) { var _pages = List.generate( - widget.dataList.length, (index) => DiaryContents(index: index)); + widget.dataList.length, (index) => DiaryContents(dataList:widget.dataList, index: index)); print(_pages); @@ -140,8 +140,9 @@ class _GenerateDiaryState extends State { class DiaryContents extends StatefulWidget { final int index; + final List dataList; - const DiaryContents({super.key, required this.index}); + const DiaryContents({super.key, required this.dataList, required this.index}); @override State createState() => _DiaryContentsState(); @@ -200,9 +201,25 @@ class _DiaryContentsState extends State { backgroundColor: Color(0xfff4c758), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(22))), - onPressed: () { - if (diariesProvider.diaries.length != - generateProvider.getDiaryIndex) {} + onPressed: () async { + if (generateProvider.isAllGen) { + print('start saving!'); + var fileNames = + await diariesProvider.saveImageToFirebase( + generateProvider.getAllImageUrl!); + print('filename : ${fileNames[0]}'); + var diary = Diary( + userID: diariesProvider.userID, + date: DateTime.now(), + tags: + Diary.listConverter(widget.dataList), + images: fileNames, + context: + generateProvider.getAllKoSummary!, + favorite: false); + print('diary filename : ${diary.images[0]}'); + diariesProvider.addDiary(diary, null); + } }, child: Text( '저장', diff --git a/lib/widgets/comment_widget.dart b/lib/widgets/comment_widget.dart index b183dda..1527ee5 100644 --- a/lib/widgets/comment_widget.dart +++ b/lib/widgets/comment_widget.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:sumday/providers/diaries_provider.dart'; import 'package:sumday/utils/variables.dart'; +import 'package:provider/provider.dart'; class CommentWidget extends StatelessWidget { final String photo; @@ -36,12 +38,28 @@ class CommentWidget extends StatelessWidget { children: [ ClipRRect( borderRadius: BorderRadius.circular(20), - child: Image.asset( - "assets/$photo", - width: 20, - height: 20, - fit: BoxFit.fitWidth, - alignment: Alignment.center, + child: FutureBuilder( + future: Provider.of(context, listen: false) + .getImageUrl(photo), + builder: + (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return SizedBox( + height: 10, + width: 10, + child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Image.network( + snapshot.data!, + width: 20, + height: 20, + fit: BoxFit.fitWidth, + alignment: Alignment.center, + ); + } + }, ), ), const SizedBox( diff --git a/lib/widgets/diary_card.dart b/lib/widgets/diary_card.dart index 1e2ce6b..326d3bc 100644 --- a/lib/widgets/diary_card.dart +++ b/lib/widgets/diary_card.dart @@ -1,6 +1,11 @@ +// import 'dart:html'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; import 'package:sumday/models/rdiary_model.dart'; +import 'package:sumday/providers/diaries_provider.dart'; class DiaryCard extends StatefulWidget { final Diary diary; @@ -17,6 +22,15 @@ class DiaryCard extends StatefulWidget { } class _DiaryCardState extends State { + String? imageUrl; + @override + void initState() { + super.initState(); + Provider.of(context, listen: false) + .getImageUrl(widget.diary.images[0]) + .then((url) => imageUrl = url); + } + @override Widget build(BuildContext context) { String formattedDate(DateTime time) => @@ -27,7 +41,9 @@ class _DiaryCardState extends State { } final ThemeData theme = Theme.of(context); - + Provider.of(context, listen: false) + .getImageUrl(widget.diary.images[0]) + .then((url) => imageUrl = url); return Container( height: 125, padding: const EdgeInsets.symmetric(vertical: 1, horizontal: 1), @@ -44,17 +60,33 @@ class _DiaryCardState extends State { child: Padding( padding: const EdgeInsets.fromLTRB(4.5, 4.5, 4.5, 4.5), child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8.0), - // border: Border.all( - // color: Colors.black, - // width: 1.0, - // ), - ), - child: Image.asset( - 'assets/${widget.diary.photos[0]}', - ), - ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + // border: Border.all( + // color: Colors.black, + // width: 1.0, + // ), + ), + child: FutureBuilder( + future: + Provider.of(context, listen: false) + .getImageUrl(widget.diary.images[0]), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return SizedBox( + height: 10, + width: 10, + child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Image.network(snapshot.data!); + } + }, + ), + ), ), ), Expanded( diff --git a/lib/widgets/diary_modal_card.dart b/lib/widgets/diary_modal_card.dart index f295f18..9ba6253 100644 --- a/lib/widgets/diary_modal_card.dart +++ b/lib/widgets/diary_modal_card.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:sumday/providers/diaries_provider.dart'; +import 'package:provider/provider.dart'; class DiaryModalCard extends StatelessWidget { final List tags; @@ -18,13 +20,33 @@ class DiaryModalCard extends StatelessWidget { children: [ ClipRRect( borderRadius: BorderRadius.circular(10), - child: Image.asset( - "assets/$photo", - width: 320, + child: FutureBuilder( + future: + Provider.of(context, listen: false) + .getImageUrl(photo), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return SizedBox( + height: 10, + width: 10, + child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Image.network(snapshot.data!, width: 320, height: 180, fit: BoxFit.fitWidth, - alignment: Alignment.center, - ), + alignment: Alignment.center,); + } + }, + ), + + + + + ), const SizedBox( height: 20, diff --git a/lib/widgets/exchange_diary_card.dart b/lib/widgets/exchange_diary_card.dart index 8f9b9f8..c37b373 100644 --- a/lib/widgets/exchange_diary_card.dart +++ b/lib/widgets/exchange_diary_card.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:sumday/providers/diaries_provider.dart'; import 'package:sumday/screens/exchange_diary_detail.dart'; import 'package:sumday/utils/variables.dart'; +import 'package:provider/provider.dart'; class ExchangeDiaryCard extends StatelessWidget { final int idx; @@ -56,13 +58,30 @@ class ExchangeDiaryCard extends StatelessWidget { children: [ ClipRRect( borderRadius: BorderRadius.circular(10), - child: Image.asset( - "assets/$photo", - width: double.maxFinite, + child: FutureBuilder( + future: + Provider.of(context, listen: false) + .getImageUrl(photo), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return SizedBox( + height: 10, + width: 10, + child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Text('Error: ${snapshot.error}'); + } else { + return Image.network(snapshot.data!, + width: double.maxFinite, height: 185, fit: BoxFit.fitWidth, - alignment: Alignment.center, - ), + alignment: Alignment.center,); + } + }, + ), + ), const SizedBox( height: 10, diff --git a/lib/widgets/exchange_diary_modal.dart b/lib/widgets/exchange_diary_modal.dart index aea3802..0a211a0 100644 --- a/lib/widgets/exchange_diary_modal.dart +++ b/lib/widgets/exchange_diary_modal.dart @@ -25,7 +25,7 @@ class _ExchangeDiaryModalState extends State { (index) => DiaryModalCard( tags: widget.diaries.getCurrTags(index).sublist(0, 3), location: widget.diaries.getCurrTags(index)[3], - photo: widget.diaries.photos[index], + photo: widget.diaries.images[index], )); return Padding( padding: const EdgeInsets.only(top: 20),