출처 https://medium.com/@myungwook

Myungwook – Medium

Read writing from Myungwook on Medium. Android Developer at NAVER Z, GDG Korea Android Organizer. Every day, Myungwook and thousands of other voices read, write, and share important stories on Medium.

medium.com

필요한 분들은 이곳으로 방문하여 자세한 내용 확인하세요











이슈
카메라 촬영후 앨범 저장시 에러




원인
안드 저장공간 보안 업데이트로 인해 야기됨

참고블로그
- https://medium.com/@myungwook/%EC%9D%B4%EC%A0%9C%EB%8A%94-android-scoped-storage%EB%A5%BC-%EC%A4%80%EB%B9%84%ED%95%B4%EC%95%BC-%ED%95%A0-%EB%95%8C-3d5c22a5a0a9

이제는 Android Scoped Storage를 준비해야 할 때

Android 10에서 외부저장소에 대해 Scoped Storage Mode가 소개되었습니다. 이에 영향을 받는 애플리케이션은 2020년 상반기까지는 Scoped mode에 대한 준비가 되어있어야 합니다.

medium.com


 

출처 ::  https://josh-b.tistory.com/26 

 

 

 

[GetX] 같은 Controller를 사용하는 여러 페이지가 있는 경우

구현하고 있는 상품 상세 페이지에는 상품을 업로드한 사람이 올린 다른 상품을 보여주는 Gridview가 있었습니다. GridView에 있는 item 중에서 하나를 선택하면 선택한 상품의 상세 페이지로 이동하

josh-b.tistory.com

Josh님 감사합니다!

 


이슈 :: 상품 상세페이지 > 추천상품 > 상품 상세페이지 > 추천상품 > 상품상세페이지

동일한 컨트롤러를 참조하는 페이지가 열리면서 문제가 발생했다.

 

페이지를 이동할때 id값을 넘겨주어 id값을 태그로 컨트롤러가 초기화 되도록 만들어준다.

Get.put(Controller(), tag: Get.parameter['id']);

결론적으로는 태그에 따라서 컨트롤러 객체가 새로 생성되어 중복을 피할수 있다.

 

출처 :: https://josh-b.tistory.com/26   < 자세한 내용은 원본글로 이동해서 확인해주세요 :)

HapticFeedback 를 사용하면 된다.
 
Android에서는 바이브레이터 퍼미션을 주어야 한다.
HapticFeedback.selectionClick(); // e.g. 버튼클릭등

 

 

 

ref. https://stackoverflow.com/questions/56402196/flutter-how-to-use-hapticfeedback

구현 하려는 정상적인 화면


# 에러

Column's children must not contain any null values, but a null value was found at index 0

 

 

 

#1. 모델 초기값을 공백처리하고 랜더링되는 위젯에서 에러 핸들링을 해보자

/* [이미지 모델] */
...

List<String> imageUrls = [''];

...



/* [ 이미지 랜더링 위젯 ] */
...
// imageUrl로 '' 공백 값이 들어올 경우 에러 위젯이 랜더링 된다
errorWidget: (context, url, error) {
          return Container(
            color: CustomColors.ErrorBackground,
            child: Center(
              child: SvgPicture.asset(
                'assets/svg/icons/alert/error_icon.svg',
                fit: BoxFit.none,
              ),
            ),
          );
        },
        
 ...

하지만 원하는 결과값은 아니였다.

 

응 이거 아니야 안봐줘 돌아가

#2. 존재하면? 이미지 위젯을 : 아니면 빈공간을 만들자 

if (!reviewModel.imageUrls.isBlank) {
    	return _imageItemWidget(reviewModel.imageUrls);
    } else {
    	return const SizedBox();
    }

 

 

 

새해에도 빡코딩

서버로 여러가지 post request api를 날릴때
이모지를 제거 하기로 했다. 😀
 
텍스트 필드에서 애초에 필터링 하도록 만들기로 합의했다.
 
여하튼 그래서 내가 쓴 관련 정규식을 정리한다.
 
ps. 앱내에 다른곳에서 한영숫자만 허용하는 부분도 있기 때문에 분리하였다.

 
[  한글(모음자음포함), 영어(대소문포함), 숫자, 특수문자일부 ]
1. 한영숫자공백허용
  static RegExp basicReg = RegExp(r"^[ㄱ-ㅎ가-힣0-9a-zA-Z\s+]*$");
 

2. 특수문자 일부

  static RegExp specialChar = RegExp(r'''
  ^!#%&@`:;-.<>,~\\(\\)\\{\\}\\^\\[\\][*][+][$][|][']["]
  ''');
3. 이모지ㅇ
더보기
Static RegExp emoji = RegExp(
'(\u{D83C}\u{DFF4}\u{DB40}\u{DC67}\u{DB40}\u{DC62}(?:\u{DB40}\u{DC77}\u{DB40}\u{DC6C}\u{DB40}\u{DC73}|\u{DB40}\u{DC73}\u{DB40}\u{DC63}\u{DB40}\u{DC74}|\u{DB40}\u{DC65}\u{DB40}\u{DC6E}\u{DB40}\u{DC67})\u{DB40}\u{DC7F}|\u{D83D}\u{DC69}\u{200D}\u{D83D}\u{DC69}\u{200D}(?:\u{D83D}\u{DC66}\u{200D}\u{D83D}\u{DC66}|\u{D83D}\u{DC67}\u{200D}(?:\u{D83D}[\u{DC66}\u{DC67}]))|\u{D83D}\u{DC68}(?:\u{D83C}\u{DFFF}\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83D}\u{DC68}(?:\u{D83C}[\u{DFFB}-\u{DFFE}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFE}\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83D}\u{DC68}(?:\u{D83C}[\u{DFFB}-\u{DFFD}\u{DFFF}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFD}\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83D}\u{DC68}(?:\u{D83C}[\u{DFFB}\u{DFFC}\u{DFFE}\u{DFFF}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFC}\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83D}\u{DC68}(?:\u{D83C}[\u{DFFB}\u{DFFD}-\u{DFFF}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFB}\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83D}\u{DC68}(?:\u{D83C}[\u{DFFC}-\u{DFFF}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{200D}(?:\u{2764}\u{FE0F}\u{200D}(?:\u{D83D}\u{DC8B}\u{200D})?\u{D83D}\u{DC68}|(?:\u{D83D}[\u{DC68}\u{DC69}])\u{200D}(?:\u{D83D}\u{DC66}\u{200D}\u{D83D}\u{DC66}|\u{D83D}\u{DC67}\u{200D}(?:\u{D83D}[\u{DC66}\u{DC67}]))|\u{D83D}\u{DC66}\u{200D}\u{D83D}\u{DC66}|\u{D83D}\u{DC67}\u{200D}(?:\u{D83D}[\u{DC66}\u{DC67}])|(?:\u{D83D}[\u{DC68}\u{DC69}])\u{200D}(?:\u{D83D}[\u{DC66}\u{DC67}])|[\u{2695}\u{2696}\u{2708}]\u{FE0F}|\u{D83D}[\u{DC66}\u{DC67}]|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|(?:\u{D83C}\u{DFFF}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFE}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFD}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFC}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFB}\u{200D}[\u{2695}\u{2696}\u{2708}])\u{FE0F}|\u{D83C}[\u{DFFB}-\u{DFFF}])|\u{D83E}\u{DDD1}(?:(?:\u{D83C}[\u{DFFB}-\u{DFFF}])\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83E}\u{DDD1}(?:\u{D83C}[\u{DFFB}-\u{DFFF}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF84}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{200D}(?:\u{D83E}\u{DD1D}\u{200D}\u{D83E}\u{DDD1}|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF84}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}]))|\u{D83D}\u{DC69}(?:\u{200D}(?:\u{2764}\u{FE0F}\u{200D}(?:\u{D83D}\u{DC8B}\u{200D}(?:\u{D83D}[\u{DC68}\u{DC69}])|\u{D83D}[\u{DC68}\u{DC69}])|\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFF}\u{200D}(?:\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFE}\u{200D}(?:\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFD}\u{200D}(?:\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFC}\u{200D}(?:\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}])|\u{D83C}\u{DFFB}\u{200D}(?:\u{D83C}[\u{DF3E}\u{DF73}\u{DF7C}\u{DF93}\u{DFA4}\u{DFA8}\u{DFEB}\u{DFED}]|\u{D83D}[\u{DCBB}\u{DCBC}\u{DD27}\u{DD2C}\u{DE80}\u{DE92}]|\u{D83E}[\u{DDAF}-\u{DDB3}\u{DDBC}\u{DDBD}]))|\u{D83D}\u{DC69}\u{D83C}\u{DFFF}\u{200D}\u{D83E}\u{DD1D}\u{200D}(?:\u{D83D}[\u{DC68}\u{DC69}])(?:\u{D83C}[\u{DFFB}-\u{DFFE}])|\u{D83D}\u{DC69}\u{D83C}\u{DFFE}\u{200D}\u{D83E}\u{DD1D}\u{200D}(?:\u{D83D}[\u{DC68}\u{DC69}])(?:\u{D83C}[\u{DFFB}-\u{DFFD}\u{DFFF}])|\u{D83D}\u{DC69}\u{D83C}\u{DFFD}\u{200D}\u{D83E}\u{DD1D}\u{200D}(?:\u{D83D}[\u{DC68}\u{DC69}])(?:\u{D83C}[\u{DFFB}\u{DFFC}\u{DFFE}\u{DFFF}])|\u{D83D}\u{DC69}\u{D83C}\u{DFFC}\u{200D}\u{D83E}\u{DD1D}\u{200D}(?:\u{D83D}[\u{DC68}\u{DC69}])(?:\u{D83C}[\u{DFFB}\u{DFFD}-\u{DFFF}])|\u{D83D}\u{DC69}\u{D83C}\u{DFFB}\u{200D}\u{D83E}\u{DD1D}\u{200D}(?:\u{D83D}[\u{DC68}\u{DC69}])(?:\u{D83C}[\u{DFFC}-\u{DFFF}])|\u{D83D}\u{DC69}\u{200D}\u{D83D}\u{DC66}\u{200D}\u{D83D}\u{DC66}|\u{D83D}\u{DC69}\u{200D}\u{D83D}\u{DC69}\u{200D}(?:\u{D83D}[\u{DC66}\u{DC67}])|(?:\u{D83D}\u{DC41}\u{FE0F}\u{200D}\u{D83D}\u{DDE8}|\u{D83D}\u{DC69}(?:\u{D83C}\u{DFFF}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFE}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFD}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFC}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{D83C}\u{DFFB}\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{200D}[\u{2695}\u{2696}\u{2708}])|\u{D83C}\u{DFF3}\u{FE0F}\u{200D}\u{26A7}|\u{D83E}\u{DDD1}(?:(?:\u{D83C}[\u{DFFB}-\u{DFFF}])\u{200D}[\u{2695}\u{2696}\u{2708}]|\u{200D}[\u{2695}\u{2696}\u{2708}])|\u{D83D}\u{DC3B}\u{200D}\u{2744}|(?:\u{D83C}[\u{DFC3}\u{DFC4}\u{DFCA}]|\u{D83D}[\u{DC6E}\u{DC70}\u{DC71}\u{DC73}\u{DC77}\u{DC81}\u{DC82}\u{DC86}\u{DC87}\u{DE45}-\u{DE47}\u{DE4B}\u{DE4D}\u{DE4E}\u{DEA3}\u{DEB4}-\u{DEB6}]|\u{D83E}[\u{DD26}\u{DD35}\u{DD37}-\u{DD39}\u{DD3D}\u{DD3E}\u{DDB8}\u{DDB9}\u{DDCD}-\u{DDCF}\u{DDD6}-\u{DDDD}])(?:\u{D83C}[\u{DFFB}-\u{DFFF}])\u{200D}[\u{2640}\u{2642}]|(?:\u{26F9}|\u{D83C}[\u{DFCB}\u{DFCC}]|\u{D83D}\u{DD75})(?:\u{FE0F}\u{200D}[\u{2640}\u{2642}]|(?:\u{D83C}[\u{DFFB}-\u{DFFF}])\u{200D}[\u{2640}\u{2642}])|\u{D83C}\u{DFF4}\u{200D}\u{2620}|(?:\u{D83C}[\u{DFC3}\u{DFC4}\u{DFCA}]|\u{D83D}[\u{DC6E}-\u{DC71}\u{DC73}\u{DC77}\u{DC81}\u{DC82}\u{DC86}\u{DC87}\u{DE45}-\u{DE47}\u{DE4B}\u{DE4D}\u{DE4E}\u{DEA3}\u{DEB4}-\u{DEB6}]|\u{D83E}[\u{DD26}\u{DD35}\u{DD37}-\u{DD39}\u{DD3C}-\u{DD3E}\u{DDB8}\u{DDB9}\u{DDCD}-\u{DDCF}\u{DDD6}-\u{DDDF}])\u{200D}[\u{2640}\u{2642}])\u{FE0F}|\u{D83D}\u{DC69}\u{200D}\u{D83D}\u{DC67}\u{200D}(?:\u{D83D}[\u{DC66}\u{DC67}])|\u{D83C}\u{DFF3}\u{FE0F}\u{200D}\u{D83C}\u{DF08}|\u{D83D}\u{DC69}\u{200D}\u{D83D}\u{DC67}|\u{D83D}\u{DC69}\u{200D}\u{D83D}\u{DC66}|\u{D83D}\u{DC15}\u{200D}\u{D83E}\u{DDBA}|\u{D83C}\u{DDFD}\u{D83C}\u{DDF0}|\u{D83C}\u{DDF6}\u{D83C}\u{DDE6}|\u{D83C}\u{DDF4}\u{D83C}\u{DDF2}|\u{D83D}\u{DC08}\u{200D}\u{2B1B}|\u{D83E}\u{DDD1}(?:\u{D83C}[\u{DFFB}-\u{DFFF}])|\u{D83D}\u{DC69}(?:\u{D83C}[\u{DFFB}-\u{DFFF}])|\u{D83C}\u{DDFF}(?:\u{D83C}[\u{DDE6}\u{DDF2}\u{DDFC}])|\u{D83C}\u{DDFE}(?:\u{D83C}[\u{DDEA}\u{DDF9}])|\u{D83C}\u{DDFC}(?:\u{D83C}[\u{DDEB}\u{DDF8}])|\u{D83C}\u{DDFB}(?:\u{D83C}[\u{DDE6}\u{DDE8}\u{DDEA}\u{DDEC}\u{DDEE}\u{DDF3}\u{DDFA}])|\u{D83C}\u{DDFA}(?:\u{D83C}[\u{DDE6}\u{DDEC}\u{DDF2}\u{DDF3}\u{DDF8}\u{DDFE}\u{DDFF}])|\u{D83C}\u{DDF9}(?:\u{D83C}[\u{DDE6}\u{DDE8}\u{DDE9}\u{DDEB}-\u{DDED}\u{DDEF}-\u{DDF4}\u{DDF7}\u{DDF9}\u{DDFB}\u{DDFC}\u{DDFF}])|\u{D83C}\u{DDF8}(?:\u{D83C}[\u{DDE6}-\u{DDEA}\u{DDEC}-\u{DDF4}\u{DDF7}-\u{DDF9}\u{DDFB}\u{DDFD}-\u{DDFF}])|\u{D83C}\u{DDF7}(?:\u{D83C}[\u{DDEA}\u{DDF4}\u{DDF8}\u{DDFA}\u{DDFC}])|\u{D83C}\u{DDF5}(?:\u{D83C}[\u{DDE6}\u{DDEA}-\u{DDED}\u{DDF0}-\u{DDF3}\u{DDF7}-\u{DDF9}\u{DDFC}\u{DDFE}])|\u{D83C}\u{DDF3}(?:\u{D83C}[\u{DDE6}\u{DDE8}\u{DDEA}-\u{DDEC}\u{DDEE}\u{DDF1}\u{DDF4}\u{DDF5}\u{DDF7}\u{DDFA}\u{DDFF}])|\u{D83C}\u{DDF2}(?:\u{D83C}[\u{DDE6}\u{DDE8}-\u{DDED}\u{DDF0}-\u{DDFF}])|\u{D83C}\u{DDF1}(?:\u{D83C}[\u{DDE6}-\u{DDE8}\u{DDEE}\u{DDF0}\u{DDF7}-\u{DDFB}\u{DDFE}])|\u{D83C}\u{DDF0}(?:\u{D83C}[\u{DDEA}\u{DDEC}-\u{DDEE}\u{DDF2}\u{DDF3}\u{DDF5}\u{DDF7}\u{DDFC}\u{DDFE}\u{DDFF}])|\u{D83C}\u{DDEF}(?:\u{D83C}[\u{DDEA}\u{DDF2}\u{DD

 

 


 

 

 

한글 ::: r"^[ㄱ-ㅎ가-힣]*$" 

영문 ::: r"^[a-zA-Z]*$"
숫자 ::: r"^[0-9]*$"
공백 ::: r"\s+"
앞뒤 공백 제거 함수 ::: str.trim()
 
e.g. 한글 + 영문 + 숫자 ::: ^[ㄱ-ㅎ가-힣0-9a-zA-Z]*$
e.g. 공백제거(대체) :::
String str = 'e x a m p l e';
str.replaceAll( RegExp(r"\s+"), "");
void main() { String value = r' asdf가나SDFG SDFGA123🤪 '; value = value.replaceAll(RegExp(r"\s+"),""); print('value ::: $value'); bool isRegExp = RegExp(r"^[ㄱ-ㅎ가-힣0-9a-zA-Z]*$").hasMatch(value); // {value} 비교할 값 print('isRegExp ::: $isRegExp'); }

이메일 정규식 추가 보완

https://daheenallwhite.github.io/ios/xcode/2019/11/13/iOS-HTTP/

 

[iOS] HTTP 접근 허용하도록 Xcode 설정하기

Dana Daheen Lee
#iOS #Swift #CleanCode #Programming

daheenallwhite.github.io

 

 

+ Recent posts