본문 바로가기

Dead Code/Flutter_Dart

(64)
[다트] VSCode snippet 생성기(generator) 꽤 오래전에 VSCode용 snippet을 만드는 엑셀파일을 만들었고, 잘 사용하고 있지만, 엑셀 프로그램을 구동하는 자체가 상당히 귀찮은 작업이다. [플러터] VS CODE - DART snippet 만들어 쓰기 일일이 코드를 쳐서 UI를 만드는 일이 생산성에 도움이 된다는 이야기를 초보자인 나는 이해를 못하겠다. 하지만, COPY/PASTE를 쉽게 쓸수 있다면 그 또한 파랑새는 아닐지 모른다. VS CODE EXTENSION으 sunnybong.tistory.com VSCode snippet을 온라인에서 생성하는 생성기가 있어 글을 남긴다. snippet generator Snippet generator for Visual Studio Code, Sublime Text and Atom. Enjoy :..
[플러터] SearchBar Widget 사용하기 검색기능을 만들일이 있을지 모르겠지만, 예전에 슬쩍 봤었던, SearchBar Widget에 뭔가 신박한 무엇인가가.. 생겼나 살펴보았다. 다짜고짜, SearchBar 위젯을 달아본다. 입력창에 별다른 제한을 두지 않으니, 그닥 큰 생각을 할 필요는 없었다. 대충 숫자를 사용해서, string list를 만들고, 필터가 걸렸을때 사용할 빈 list를 만들었다. List list = [ "1", "2", //... 중간 생략 ]; List filteredList = []; 입력값에 제한을 둔다면 컨트롤러가 필요하겠지만, 이번엔 건드리지 않는 것으로 한다. var textcontroller = TextEditingController(); 복잡하지만, onChanged 이하 구문만 살펴보면 될 것이다. 입력된..
[플러터] Sheets로 이미지 URL의 EXIF 정보 얻어내기 Sheets를 DB로 사용하는만큼, 데이터를 손쉽게 추가할 수 있는 장점이 있다.(아니, 이미지 원본이 함께 저장되는 DB에서는 더 쉽게 처리할 수 있을 것 같기는 하다.) 웹에 올려진 이미지에서 EXIF 정보를 얻어내는 후처리가 필요한 경우에 아주 요긴하게 사용할 수 있을 것 같은 느낌이 있었으나, APPSCRIPT부터 시작해서, 꽤 오래전에 봤었던 내용을 찬찬히 복기해 보고 있자니, 생각보다 꽤 오랜 시간이 걸렸다. 사진 앨범의 특정사진을 탭했을때, EXIF 정보가 같이 노출되길 바랬던 본 프로젝트에서 전제되어있는 컨디션은 아래와 같다. _원본 이미지가 특정 경로에 올라가 있다. _특정열에 경로(URL) 정보가 들어가 있다. 물론 해당 경로상의 이미지는 EXIF 데이터를 가지고 있다. _Sheets의..
[플러터] 심플 애니메이션 Animated... 위젯을 쓰지 않고, 애니메이션을 사용하기 귀찮지만, 막상 하고 보면 마땅히 쓸 곳은 없고, 애매하다. Container Stateful Widget에서 SingleTickerProviderStateMixin 호출 class _MainPageState extends State with SingleTickerProviderStateMixin 컨트롤러와 애니메이션 변수 생성 late AnimationController animationController; late Animation animation; 그리고 초기화, @override void initState() { // TODO: implement initState super.initState(); animationController ..
[플러터] minSdkVersion 위치 특정 패키지를 사용하다보면, 최소한의 안드로이드 SDK를 00버전 이상으로 하라고 에러가 뜰 때가 있는데, app > build.gradle 파일을 보면, minSdkVersion 표기가 되어있지만, 음... 어딘가(flutter.minSdkVersion)를 참조하고 있다. 그냥 지우고 숫자를 입력해도 무방은 하다. defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.fluttertest" // You can update the following values to match yo..
[다트] 리스트 중복 제거 리스트에서 중복을 제거하는 방법이야 여러가지가 있겠지만, 아래 방법은 어떨까? toSet으로 중복을 제거하고, 다시 리스트로 바꿔주는 방법이다. List listSample = [1, 2, 2, 3, 4, 4, 23, 24, 324, 2353, 12, 1, 12]; main() { Set setSample = listSample.toSet(); print(setSample); // Console >> {1, 2, 3, 4, 23, 24, 324, 2353, 12} List setNewList = []; setNewList.addAll(setSample); print(setNewList); // Console >> [1, 2, 3, 4, 23, 24, 324, 2353, 12] print('newList\..
[플러터] Map 정렬하기 아래와 같은 dblist Map이 있다고 하면, Map dblist = { 0: [1, '가', 8, '나'], 1: [2, '마', 4, '바'], 2: [6, '자', 1, '치'], }; Map의 구성은 아래와 같다. print(dblist); //console >> {0: [1, 가, 8, 나], 1: [2, 마, 4, 바], 2: [6, 자, 1, 치]} 정렬을 위해 Key값을 리스트로 추출하는 방법은 아래와 같다. // 키 값을 리스트로 추출 var sortedKeys = dblist.keys.toList(growable: false); print(sortedKeys); //console >> [0, 1, 2] LinkedHashMap 사용을 위해서는 collection 패키지를 import ..
[플러터] 구글 Sheets 를 DB로 사용해서 갤러리 만들기 #2 갤러리앱 얼마전에 갤러리앱을 만들고 있다는 글을 썼었다. [플러터] 구글 Sheets 를 DB로 사용해서 갤러리 만들기 #1 플러터와 DB 이미지 갤러리라면, DB를 구성하고 이미지를 저장하고 관리하는 것이 여간 귀찮은 일이 아닐 것이다.(해본 적이 없어서 추정) 🤭🤭🤭🤭 Firebase로 youtube 리스트를 구성한 적이 있었 sunnybong.tistory.com 이번엔 만드는 과정은 아니고, 만들다 보니 debug 모드에서는 아무 문제없지만, release모드에서는 구글Sheets에 호출한 데이터가 불러와지지 않는다. - release 모드인만큼 API키를 별도로 생성해야하는 줄 알고, SHA-1까지 생성은 했으나, 음... 입력할 곳이 없다. - playstore에 출고할 때처럼, 개발자 key..
[플러터] .json theme 파일사용하기 main.dart 파일에서 패키지를 임포트 해준다. json_theme.dart는 외부 패키지이므로 pubspec.yaml 파일에 미리 등록을 해줘야 한다. import 'package:flutter/material.dart'; import 'dart:convert'; // for jsonDecode import 'package:flutter/services.dart'; // for rootBundle import 'package:json_theme/json_theme.dart'; // for theme decoder assets 폴더안에 theme.json 파일을 저장해주고, 아래와 같이 불러온다. void main() async { // 테마데이터 실행 _ from json_theme, asset W..
[플러터] widget : Wrap column / row 대신사용 column 이나, row widget을 사용할 때, 내부 widget들의 사이즈가 screen size를 넘게 되면, 오류가 발생하는데, 대신 Wrap 위젯을 사용하면, 자동으로 하단으로 내려오게 된다. 기본적인 기능인 것 같은데, 딱히 쓸일이 있을지는 모르겠다. Center( child: Wrap( spacing: 10, // horizontal spacing runSpacing: 10, // vertical spacing children: [ textFieldWidget(), textFieldWidget(), textFieldWidget(), textFieldWidget(), textFieldWidget(), textFieldWidget(), textFieldWidg..
[플러터] package : fluttertoast 생각보다 처리하기 귀찮은 toast sample을 미리 작성해둔다. Toast 변수 선언, initState에서 초기화 초기화를 해주고, 현재 context를 연결해준다. late FToast fToast; void initState() { super.initState(); fToast = FToast(); fToast.init(context); } toast 디자인 method 구지 이럴필요가 있을까 싶지만, toast custom 디자인을 만들어 둘 수 있는게 더 낫겠지? _showToast() { Widget toast = Container( padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 12.0), decoration: BoxDe..
[다트] dart 3.0 - records 괄호 지옥 개발 전공자가 아니면, 괄호에 익숙하지 못한데, 다트 3.0의 records는... 괄호 지옥이다. void main() { var (name, age) = userInfo(json); print(name); print(age.isEven); if (age.isEven) { print("even"); } else { print('odd'); } } (String, int) userInfo(Map json) { return (json['name'] as String, json['age'] as int); } final json = { 'name': 'Dash', 'age': 10, 'color': 'blue', }; // log >> Dash // log >> true // log >> even
[플러터] 구글 Sheets 를 DB로 사용해서 갤러리 만들기 #1 플러터와 DB 이미지 갤러리라면, DB를 구성하고 이미지를 저장하고 관리하는 것이 여간 귀찮은 일이 아닐 것이다.(해본 적이 없어서 추정) 🤭🤭🤭🤭 Firebase로 youtube 리스트를 구성한 적이 있었는데, 모바일로 경로를 등록하는 것도 firebase에서 수기로 입력하는 것도 상당히 귀찮다. 그래서, 엑셀처럼 구글 Sheets 로 테이블을 구성하여, DB로 사용하는 방법을 구성해 보았다. GCP/Sheets 작업 당연히, GCP 프로젝트를 생성해야한다. 꽤 오래전에 만들어 놓은터라... 무슨 난관이 있었는지 기억나지 않는다. 서비스 계정을 생성한다. 누르기만 하면 된다. 구글 Sheets의 원하는 프로젝트에 들어가서, share 에다가 서비스 계정을 공유해준다. 서비스 계정이 뭔가 했더니, 내 껄..
[플러터] Rive animation 실행은 해보자 #2 Rive, StateMachine Package의 기능을 배우는 것과 함께, Rive는 자체 그래픽 툴까지 익혀야하는데, 상호작용하는 방법까지 배워야하므로, 진입장벽이 낮은편도, 결과물이 마음에 드는 편도 아니다. Rive로 페이지 indicator를 만든다면... 생각보다 상당히 귀찮은 작업들이 있다. 첫 페이지는 floating action button을 클릭하면, 랜덤하게 애니메이션이 재생되도록 했다. 두번째 페이지로 appbar의 화살표를 통해 이동하면, 페이지 슬라이드에 따라 애니메이션이 재생되도록 했다. 겁나 빠르게 누르면, 애니메이션이.... 멈칫한다. 이 브라우저는 iframe을 지원하지 않습니다 음... 페이지 사이즈가 좀 작아서 감동이 크지는 않다. 끝.
[플러터] 자질구래한 methods PageView web에서 마우스로 swipe하기 MaterialApp에서 scrollBehavior를 호출 class PreSetting extends StatelessWidget { const PreSetting({super.key}); @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider(create: ((context) => MyData())), ], child: MaterialApp( debugShowCheckedModeBanner: false, scrollBehavior: AppScrollBehavior(), home: MainPage(), ), ); } } M..
[플러터] Rive 오랜만에 사용 Rive flutter의 강점 중 하나는 Rive에 있다고들 말한다. 그러므로 사용법을 알고 있는 것이 좋겠다. Rive 테스트 Flare에서 Rive로 이름을 바꾼 뒤, 기능이 많이 추가되었는데, 기존에 편하게 사용했던 나인데, 오히려 사용에 혼란함이 생겼다. 그래도, 무료이기도 하니, 아래와 같은 예제를 오랜만에 만들어본다. * 예제는 모바일에서 똑바로 나오지 않음 애니메이션을 컨트롤 하는 예제로, statemachine 이라는 rive 자체의 control 기능을 사용하지 않고, controller의 isActive를 사용했다. 이 브라우저는 iframe을 지원하지 않습니다 다음은, page transition 을 rive 애니메이션으로 사용한 것이다. 뜻밖의 장벽이 많다.;;; 앞으로 더 많은 인..
[플러터] web 빌드 그리고 row/column 리스트 개별 관리 Github에 flutter로 만든 웹사이트를 올릴때, flutter build web 으로 빌드 web 폴더 push index 파일의 경로를 / 에서 ./ 로 수정 Row나 Column 위젯에서, 리스트의 일부만 특정한 함수를 적용하고 싶다면, 리스트를 2개로 가르고, 1번리스트에만 기능을 적용한다. 그리고 두개의 리스트를 +로 합쳐준다. 아래 예시는 리스트 중 3개의 Container Widget 중 1,2번만 색상이 변경되는 경우를 만들어 본 것이다. 이 브라우저는 iframe을 지원하지 않습니다 child: Row( mainAxisAlignment: MainAxisAlignment.center, children: colortilelist + [ Container( color: Colors.amb..
[플러터] Rive animation 실행은 해보자 #1 flare에서 rive로 변경되고, 코드도 좀 많이 변경된 듯하다. 음.. 짜..... 그래도 해보자. controller부터 만들고 late RiveAnimationController _rivcontroller; bool get isPlaying => _rivcontroller.isActive; isactive 값을 반전시키는 메소드를 넣어준다. void _toggleAnimation() { setState(() { _rivcontroller.isActive = !_rivcontroller.isActive; }); } initState에서 controller를 oneshotanimation으로 등록해준다. @override void initState() { super.initState(); // _co..
[플러터] reorderableList - 리스트 순서 바꾸기 좀 편하게 해둘수도 있을 것 같지만, 다들 이렇게 헤깔리게 사는지 모르겠다. onReorder: (int oldIndex, int newIndex) { setState(() { if (oldIndex < newIndex) { newIndex -= 1; } final int item = mylist.removeAt(oldIndex); mylist.insert(newIndex, item); print(mylist); }); },
[플러터] 위젯 사이즈 확인하기 GlobalKey... 이 녀석 어디다 쓰는지 명쾌하지 않았는데, 그중 한 예제가 될 수 있을 듯하다. 우선 키를 생성한다. GlobalKey sizekey = GlobalKey(); 사이즈 확인을 원하는 위젯에서, 키를 받아온다. Positioned( child: SizedBox( key: sizekey, // apply Global key for check size... width: 200, height: 250, ), ), onPressed 이하 코드를 보게 되면, GlobalKey에서 Size를 가져오게 된다. 솔직히 말하면, 정확하게 무슨 과정인지 잘 모르겠다. Positioned( top: 180, left: 20, child: TextButton( style: ButtonStyle( // f..
[플러터] 탭한 위치의 위치값 찾기 탭한 위치의 위치값(Offset)을 찾으려고 한다. positioned tap detector 패키지를 사용한다. 패키지 호출 import 'package:positioned_tap_detector_2/positioned_tap_detector_2.dart'; 탭할때마다, 위치값이 바뀔거고, setState처리 해주기 귀찮으니, provider 사용 class MyPosition with ChangeNotifier { TapPosition _position = TapPosition(Offset.zero, Offset.zero); TapPosition get position => _position; positionChange(TapPosition newpos) { _position = newpos; not..
[플러터] web - NetworkImage, 이미지 안뜰 때 플러터 코드를 web에서 돌린다면, 꽤 많은 튜닝이 있어야 하겠지만, networkimage가 안될 줄은 몰랐다. 찾아보니, build 할때 렌더러 옵션을 줘야한다고 한다. flutter build web --web-renderer html --release 후훗.
[플러터] 엑셀 날짜를 DATETIME으로 변경 GOOGLE SHEET에서 날짜 값을 불러올 때, 이를 DART 형식으로 변경하는 함수이다. 출처를 꼭 밝혀드리고 싶었는데, 까먹었다. STACKOVERFLOW의 천재 외국인께 감사. String timeFromExcel(String mydate) { const gsDateBase = 2209161600 / 86400; const gsDateFactor = 86400000; var dateformat = DateFormat('yy-MM-dd'); final date = double.tryParse(mydate); if (date == null) return '-'; final millis = (date - gsDateBase) * gsDateFactor; var date2 = DateTime.fromMi..
[플러터] 플러터로 만든 웹페이지 github 호스팅 시 안뜰 때. 웹호스팅이 귀찮은 나는 github에 파일을 올려둔다. 어떤 제약사항이 있는지는 잘 모르겠다. 플러터로 웹 빌드를 하게 된 후 그냥 올리게 되면, 로딩이 안될 것이다. index.html 파일에서.. 에 점을 하나 추가하여 로 만들어 주면 정상적으로 로딩이 된다. 파일 경로 인식의 문제인 듯하다. 설마 나만 모른건 아니겠지?
[다트] MAP : Map<int, List> 구글 시트에서 컬럼값을 리스트로 가져왔더니, 각 열마다 따로 논다. 하나의 키 값으로 정렬을 하고 싶은데.. MAP을 사용해서, MAP을 만들어서 활용해야겠다. List list1 = [1, 2, 3]; List list2 = ["a", "b", "x"]; List list3 = ["sfdsfsfd", "wetrwgtre", "dgerb"]; List listAll = [list1, list2, list3]; Map listToMap = {}; ltm() { for (int x = 0; x < list1.length; x++) { Map _newEntries = { list1[x]: [list2[x], list3[x]] }; listToMap.addEntries(_newEntries.entries); }..
[플러터] textbutton Hover 설정 Flutter 웹에서는 MOUSE라는 디바이스에 대한 설정도 필요하게 되었다. 이로 인해 여러가지가 귀찮게 되었다. ㅋㅋ TextButton( style: ButtonStyle( overlayColor: MaterialStateProperty.all(Colors.red), backgroundColor: MaterialStateProperty.all(Colors.black12), ), onHover: (hover) { setState(() { _buttonColor = hover ? Colors.white : Colors.black; }); }, onPressed: () {}, child: Text( 'To second Page', style: TextStyle(color: _buttonColor), ),..
[플러터] SnackBar / AlertDialog Flutter 2.0부터 Scaffold.of(context).showSnackBar 는 deprecated. ScaffoldMessenger.of(context).showSnackBar 로 변경하여 사용하는데, 더 이상 Builder를 따로 쓰지 않아도 되는 듯하다. //button1 ElevatedButton( child: const Text('Show SnackBar'), onPressed: () { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: const Text('this is snackbar'), action: SnackBarAction( label: 'Undo', onPressed: () { // tab snackbar }),..
[플러터] Prefer const with constant contructors 언제부터인가, 습관적으로 const 키워드는 안쓰는데, 이런 에러가 난다. Prefer const with constant contructors 자동으로 추가되는 flutter_lints 때문이리라. 없애는 방법은? 아래와 같이 const 키워드를 붙이라고 밑줄이 가 있다면, 해당 파일 내에서 전체 없애기 import 이전에 아래와 같이 적어준다. // ignore_for_file: prefer_const_constructors 특정 줄만 없애기 해당 라인 위에 아래와 같이 적어준다. // ignore: prefer_const_constructors 새로운 기능이 있으면, stack over flow 가 아니라 설명서를 봐야하거늘 ㅉㅉ
[플러터] RAISEDBUTTON DEPRECATED 플러터 RAISEDBUTTON DEPRECATED 나같은 비전공자에게 신규 프레임워크는 처음부터 부담이 적다는게 장점이(었)다. 플러터는 패키지도 적고 해서, 부담이 적었는데, 왠걸.. 올 것이 왔다. DEPRECATED 코드가 생기기 시작했고, NULL SATETY는 기름을 붓는다. 가장 많이 쓰는 RAISEDBUTTON이 DEPRECATED 될 줄 몰랐는데, 이왕 이렇게 된거 새로 생긴 똑!같!은! 버튼을 써보자. ElevatedButton 이름부터 심상치 않다. 선뜻 애착이 가지 않는다. STYLE을 주는게 ButtonStyle과 MaterialStateProperty로 인해 복잡해진 느낌이다. 기능이 좋아졌으려나? 구성의 자유도가 올라갔으려나? 오랜만에 켜본 플러터.. 일보 전진 후에 이십보 후퇴..
[다트] 구구단 구구단을 짜보자 다트로는 플러터 코드만 짯는데, 다트도 피해갈수 없다. import 'dart:io'; main(){ final fileName = "gugu.txt"; File(fileName).writeAsString('GUGUDAN\n').then((File file) { for (int tNum = 1; tNum < 10; tNum++) { for (int dan = 2; dan < 10; dan++) { int result = dan * tNum; String txt = '$dan*$tNum=$result' + '\t '; if (dan == 2) { txt = '$dan*$tNum=$result' + '\t'; } file.writeAsStringSync(txt, mode: FileMode.a..