일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- PDF검색#PDF검색챗봇#NEXTJS#스터디#스타트업#랭체이#langchain#prisma#sqlite#
- #창작#SNS#스포츠#반려동물#연애#과제#레시피#활동#건강#운세#글쓰기#비즈니스 #AI비서#챗GPT#CHATGPT
- 마이봇#chatgpt#ai#인공지능
- 로우코드#ERP#관리시스템#상품관리#선택박스#자동화프로그램
- 11만4천 달러
- 마이봇#핸드폰대체#
- Sol
- xrp
- 도지코인
- 솔라나
- 펫버틀러#서버연동#프로필등록#로그인서버연동#이미지#동영상#업로드용 화면#앱개발#플러터#반려생활#로딩바#loading bar#
- flutter#sqlite#chatGPT#
- PDF#챗봇검색#서비스#GPT4#PGT3.5#GPT#랭체인#챗봇#CHATBOT#LLM#문서검색
- 마이봇#pdf챗봇#상담챗봇#faq챗봇#chatgpt#랭체인#llm
- 마이봇#API 설정
- flutter#채팅창@메모창#url링크#날짜추가
- 마이봇#문서챗봇#PDF#TEXT#유투브#챗봇만들기#랭체인# langchain#벡터데이터#자료검색#챗GPT#GPT4#챗지피티
- 리플
- doge
- 로우코드#lowcode#erp#관리시스템#시트메이트#시트메타#엑셀업로드#엑셀다운로드#그리드#데이터관리#생산관리시스템#로그관리#히스토리#입력체크
- 비트코인
- 광동온더그린#프랜즈#가상CC#스크린골프#
- 비트코인 #암호화폐 #코인투자 #가상화폐 #이더리움 #알트코인 #코인뉴스 #투자전략 #코벡스 #코인계산기
- 플러터#sms#mms#문자보내기
- 쇼핑몰관리시스템#매입관리#시트메타#매입채널#엑셀업로드
- btc
- #비트코인 #이더리움 #트럼프코인 #암호화폐뉴스 #코인시황 #일본디지털화폐 #디파이 #HBAR #코인투자 #이더리움전망
- 커피#그라인더#통돌이 오픈 #로스팅#드립커피#생두#원두
- #비트코인 #암호화폐 #코인투자 #가상화폐 #이더리움 #알트코인 #코인뉴스 #투자전략 #코벡스 #코인계산기
- 마이봇#아이폰#아이폰심사#IT고시#
- Today
- Total
혼자서 앱 만드는 개발자 함께하는 AI 세상
[펫버틀러] 반려 동물 고민 상담 앱 - 개발 13 일차 (설정 화면 만들기) 본문
- 설정화면은 앱개발에 있어서 거의 필수 적용해야 하는 페이지다
- 커뮤니티 앱을 만들 계획이라 따라서 항목들은 프로필 설정 및 공개 설정 알람받기등 공개정보와 링크페이지 공지사항과 카카오톡 문의
- 공개 하지 않으면 앱을 서버에 저장하지 않기 때문에 데이터를 백업하거나 복구 할 수 있는기능을 설정페이지에 추가 하고
- 로그아웃 및 로그인 기능을 설정페이지에 적용했다.
- 설정페이지가 끝나면 하나씩 기능구현 할 예정이다..
- 아래 최종 적용 페이지 이다.
적용 패키지 apache2.0 라이센스
https://pub.dev/packages/settings_ui
settings_ui | Flutter Package
Create native settings for Flutter app in minutes. Use single interfaces to build
pub.dev
샘플중에 애플 화면처럼 적용한 예제가 있어 적용 해봤다.
https://github.com/yako-dev/flutter-settings-ui/tree/master/example/lib/screens/gallery
GitHub - yako-dev/flutter-settings-ui: Create native settings for Flutter app in a minutes.
Create native settings for Flutter app in a minutes. - GitHub - yako-dev/flutter-settings-ui: Create native settings for Flutter app in a minutes.
github.com
- 적용을 위해
- flutter pub add settings_ui
- import 'package:settings_ui/settings_ui.dart'; 추가
- 전체 소스 입니다.(개발중)
import 'dart:io';
import 'dart:isolate';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:intl/intl.dart';
import 'package:path_provider/path_provider.dart';
//import 'package:permission_handler/permission_handler.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:sqflite/sqflite.dart';
import 'package:filesystem_picker/filesystem_picker.dart';
class SettingWidget extends StatefulWidget {
const SettingWidget({super.key});
@override
State<SettingWidget> createState() => _MyWidgetState();
}
void downloadCallback(String id, DownloadTaskStatus status, int progress) {
print(
'Background Isolate Callback: task ($id) is in status ($status) and process ($progress)');
final SendPort send =
IsolateNameServer.lookupPortByName('downloader_send_port')!;
send.send([id, status, progress]);
}
bool darkTheme = true;
class _MyWidgetState extends State<SettingWidget> {
bool vibration = false;
late String path = "";
@override
initState() {
// TODO: implement initState
getDatabasesPath().then((value) {
path = value;
});
super.initState();
}
@override
Widget build(BuildContext context) {
var downloadfile =
"/Diary_${DateFormat('yyyyMMddhh24mmss').format(DateTime.now())}.db";
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.amberAccent,
bottomOpacity: 0.0,
elevation: 0.0,
title: const Text(
'설정',
style: TextStyle(fontSize: 17),
),
leading: IconButton(
icon: const Icon(Icons.edit),
tooltip: '설정',
onPressed: () {},
),
),
body: SettingsList(
applicationType: ApplicationType.cupertino,
platform: DevicePlatform.iOS,
sections: [
SettingsSection(
title: Text('설정'),
tiles: [
SettingsTile.navigation(
onPressed: (_) {},
title: Text('프로필설정'),
value: Text(''),
),
SettingsTile.switchTile(
onToggle: (value) {
setState(() {
darkTheme = value;
});
},
initialValue: darkTheme,
title: Row(
children: [
Icon(Icons.dark_mode),
Text(' Dark 모드'),
],
),
),
SettingsTile.switchTile(
onToggle: (value) {
setState(() {
darkTheme = value;
});
},
initialValue: darkTheme,
title: Row(
children: [
Icon(Icons.people_rounded),
Text(' 프로필공개'),
],
),
),
SettingsTile.switchTile(
onToggle: (value) {
setState(() {
darkTheme = value;
});
},
initialValue: darkTheme,
title: Row(
children: [
Icon(Icons.alarm_on),
Text(' 알람받기'),
],
),
),
],
),
SettingsSection(
title: Text('고객지원'),
tiles: [
SettingsTile.navigation(
onPressed: (_) {},
title: Row(
children: [
Icon(Icons.article),
Text(' 공지사항'),
],
),
value: Text(''),
),
SettingsTile.navigation(
onPressed: (_) {},
title: Row(
children: [
Icon(Icons.phone_android),
Text(' 카카오톡1:1문의'),
],
),
value: Text(''),
),
],
),
SettingsSection(
title: Row(
children: [
Text('백업'),
],
),
tiles: [
SettingsTile.navigation(
onPressed: (_) async {
var directory = await Directory(
'/storage/emulated/0/Download/PetButler')
.create(recursive: true);
getApplicationDocumentsDirectory().then((value) {
FilesystemPicker.open(
title: '저장폴더',
showGoUp: true,
rootName: 'Download/',
permissionText: '저장권한',
context: context,
// allowedExtensions: ['.db'],
rootDirectory:
Directory('/storage/emulated/0/Download'),
fsType: FilesystemType.folder,
pickText: '저장폴더 저장하기',
).then((value) {
File(path + "/Diary.db")
.copy(value! + downloadfile)
.then((value) => {
Fluttertoast.showToast(
msg: "저장되었습니다. 파일명:" + downloadfile)
});
});
});
},
title: Row(
children: [
Icon(Icons.backup),
Text(' 백업'),
],
),
),
SettingsTile.navigation(
description:
Text("백업/복구는 데이터 보증을 하지 않습니다. 중요한 정보는 백업하시기 바랍니다. "),
title: Row(
children: [
Icon(Icons.upload),
Text(' 복구'),
],
),
onPressed: (context) {
getApplicationDocumentsDirectory().then((value) {
FilesystemPicker.open(
title: '적용파일',
context: context,
rootDirectory:
Directory('/storage/emulated/0/Download'),
fsType: FilesystemType.file,
// allowedExtensions: ['.db'],
fileTileSelectMode: FileTileSelectMode.wholeTile,
).then((value) {
if (value != null) {
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text('적용하시겠습니까?'),
content: Text(''),
actions: <Widget>[
TextButton(
child: Text('취소'),
onPressed: () {
setState(() async {
Navigator.of(context).pop();
});
},
),
TextButton(
child: Text(
'복구',
style: TextStyle(
color: Colors.red),
),
onPressed: () {
if (File(value).length() != 0 &&
value != null) {
var auto_path = value!
.substring(
0,
value!
.lastIndexOf(
"/")) +
downloadfile;
File(path + "/Diary.db")
.copy(auto_path);
File(value!)
.copy(path + "/Diary.db");
setState(() {
Fluttertoast.showToast(
msg: "백업된파일로 복구되었습니다.");
Navigator.of(context).pop();
});
} else {
Fluttertoast.showToast(
msg:
"해당 파일을 복구 할수 없습니다.");
}
})
]));
}
});
});
}),
]),
SettingsSection(
title: Text('로그아웃'),
tiles: [
SettingsTile.navigation(
onPressed: (_) {},
title: Row(
children: [
Icon(Icons.logout),
Text(' 로그아웃'),
],
),
),
SettingsTile.navigation(
onPressed: (_) {},
title: Row(
children: [
Icon(Icons.remove_circle),
Text(' 탈퇴'),
],
),
),
],
),
],
),
);
}
Future<void> _asyncConfirmDialog(BuildContext context) async {
return showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: Text('로그아웃 하시겠습니까?'),
content: Text(''),
actions: <Widget>[
TextButton(
child: Text('취소'),
onPressed: () {
setState(() {
//sprint(current);
Navigator.of(context).pop();
//ctr.index = current;
});
},
),
TextButton(
child: Text('확인'),
onPressed: () {
Navigator.of(context).pop();
// exit(0);
},
)
],
);
},
);
}
}
개발에 중요한건 빠른 적용인것같다.
이렇게 정리해서 올리면 나중에 다시 적용할때 빠르게 적용 할 수 있을것같다.
'펫버틀러' 카테고리의 다른 글
[펫버틀러] 반려 동물 고민 상담 앱 - 개발 16 일차 (Dark 테마적용) (0) | 2023.01.24 |
---|---|
[펫버틀러] 반려 동물 고민 상담 앱 - 개발 14 일차 (파일백업을 위해 퍼미션 체크) (2) | 2023.01.23 |
[펫버틀러] 반려 동물 고민 상담 앱 - 개발 12 일차 (프로필화면에 달력적용) (2) | 2023.01.11 |
[펫버틀러] 반려 동물 고민 상담 앱 - 개발 11 일차 (동영상 썸네일 / 플레이어 적용 ) (0) | 2023.01.02 |
[펫버틀러] 반려 동물 고민 상담 앱 - 개발 10 일차 (이미지/동영상 첨부 업로드 시 로딩 바 prograss loading bar ) (0) | 2023.01.01 |