안녕하세요. 'Schedule 저장해버리기' 강의를 듣고 따라하던중 갑자기 어느순간 bottom sheet 버튼을 클릭하면 창이 나오지 않고 사진처럼 오류난 것처럼 회색창으로 변합니다. 다른 메인 캘린더나 스케쥴카드 이런 부분에서는 전혀 오류가 없는데 bottom sheet 버튼을 눌렀을 때 이런 오류가 생깁니다. 에러코드는 RenderBox was not laid out: RenderPointerListener#fd365 relayoutBoundary=up1 NEEDS-COMPOSITING-BITS-UPDATE 'package:flutter/src/rendering/box.dart': Failed assertion: line 2001 pos 12: 'hasSize' is not true. 이렇게 뜨는데 어느부분이 잘못되었는지 도저히 원인을 못찾겠습니다. 도움 부탁드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ...는 Spread Operator 이고 ..이 Cascading Operator 아닌가해서 질문드립니다. dart 강의 3강, 32분 쯤에 나오는 내용입니다.
안녕하세요. 지금 강의를 여러번 돌려보고 천천히 생각하는데도 전혀 이해가 되지 않습니다 ㅠ // 2. _get 만들어 좀 더 간단하게 하기 console.log( _map( _filter(users, function(user) { return user.age >= 30; }), _get('name'))); // function(user) { return user.name} 여기 코드에서 _get('name')에 인자가 더 들어가야되지않나여??... 예시들 중에서 var user1 = users[0]; console.log(user1.name); console.log(_get(user1, 'name')); console.log(_get('name')(user1)); var get_name = _get('name'); console.log( get_name(user1) ); 여기서 보면 _get('name')(user1)이라고 썼는데 _map에서 사용했을때 어떻게 저렇게 동작이 되는지 잘 이해가 안되네요 ㅠ 설명 좀 부탁드리겠습니다 ㅠ 다른 질문들 보니 저랑 같은 생각하시는 분께 답변이차근차근 생각해보라고 되어있는데 계속 봐도 이해가 안가서 다시 질문올립니다 ㅠ
안녕하세요 코드팩토리님! 선생님의 dart강의를 듣고 flutter로 혼자 사이드 프로젝트를 진행하고 있는 중에 질문이 있어 이렇게 글을 남깁니다. 다만 무료 dart 강의만 듣고 flutter 질문을 드리는 것이 죄송하네요..ㅜㅜ 우여곡절끝에 제가 생각하던 앱을 비슷하게나마 완성을 했는데요. 아기 사진을 가족들과 공유할수 있는 사진앨범 앱을 만들었습니다. 기본적으로 firebase를 연동하여 데이터를 받아와서, gridview 이미지들을 보여주고있습니다. 스크롤 시, 추가적으로 데이터들을 받아와서 이미지들을 보여주게 되는데요 여기서 이미지들이 다 불러와지지 않은 상태에서 빠르게 스크롤을 하면 앱이 꺼져버리는 문제가 생겼습니다. 구글링 및 디버깅을 해보니 memory leak으로 앱이 꺼지는 것 같은데 Image.network를 CachedNetworkImage로 바꿔도 보고 setState를 남발해서 그런가 싶어서 코드팩토리님 유튜브의 'provider로 sns 스타일 infinite scroll 구현하기!' 를 참고하여 provider로 상태관리를 하도록 바꿔도 보고 const를 선언할수 있는 부분은 선언하고 최대한 build를 호출 안하게끔, build에 복잡한 로직이 안들어가게끔 수정하였는데요. 그럼에도 불구하고 이 문제는 고쳐지지가 않더라구요 ㅜㅜ 불러오는 이미지 url을 CachedNetworkImage로 보여주지 않고 그냥 Text로 보여주면 해당 문제가 안나오는걸로 봐선 뭔가 이미지 관련해서 문제가 있는것 같긴한데 어떻게 해결해야하는지 감이 잡히지도 않고, 답답한 심정입니다 ㅜㅜ 괜찮으시다면 방법을 제시해주실수 있을까 싶어 질문남깁니다. 감사합니다!
C.reduce = curry((f, acc, iter) => { log([...acc]); return iter ? reduce(f, acc, catchNoop(iter)) : reduce(f, catchNoop(acc)); }); reduce에 acc를 전개연산자로 펼쳐서 전달하지 않고 이전에 하게 되면 저렇게 iterable의 값이 모두 소비된 상태로 전달 되기 때문에 reduce의 값이 undefined로 평가 되는 것일까요...?
const reduce = curry((f, acc, iter) => { if (!iter) return reduce(f, head((iter = acc[Symbol.iterator]())), iter); iter = iter[Symbol.iterator](); return go1(acc, function recur(acc) { let cur; while (!(cur = iter.next()).done) { /* acc = reduceF(acc, cur.value, f); */ const a = cur.value; acc = a instanceof Promise ? a.then( (a) => f(acc, a), (e) => (e === nop ? acc : Promise.reject(e)) ) : f(acc, a); if (acc instanceof Promise) return acc.then(recur); } return acc; }); }); 이렇게 실행하면 Uncaught (in promise) TypeError: Chaining cycle detected for promise #<Promise> 위와 같이 순환참조 오류가 발생하는데 이렇게 발생하는 이유가 아래와 같은 순서로 인해 발생하는게 맞는지 확인좀 부탁드립니다... acc에 a.then메서드가 호출된 결과로 이때 pending 상태의 Promise 객체가 할당됨 a.then메서드의 콜백함수가 실행되며 1번의 pending상태의 Promise객체가 리턴 pending상태이기 때문에 settled상태가 아니며 프로미스 체이닝이 불가능 하고 프로미스를 사용 할 수 없는 무한정 대기상태에 빠짐 프로미스 다루는게 무진장 어렵다는것을 한 강의 한 강의 마다 느낍니다...
compact 함수를 선언하면 TypeError: _compact is not a function라고 나오는데 이유를 알 수 있으ㅡㄹ까요? const compact = filter(_identity) console.log( _compact([1, 2, 0, false, null, {}])); // 2. compact
StockListing 함수를 직접 제작해서 조회하는 부분 질문입니다. 22년 1월 KRX 데이터와 23년 1월 현재 KRX 데이터가 많이 다른거 같습니다. 그래서 StockListing 함수를 동일하게 제작하면 전혀 다른 결과가 나옵니다. KRX 데이터가 변동이 생길때마다 StockListing 함수를 수정해야 하는 상황인데 해결 방법 문의드립니다.
안녕하세요. 먼저 좋은 강의와 항상 빠르게 답변을 해주셔서 너무 감사합니다. 질문은 아래와 같습니다. 지연성 1 파트에 있는 평가순서 강의를 복습하면서 클레이슬리 컴포지션의 평가 순서를 생각해보았는데, 제 생각이 맞는지 궁금합니다. 예시코드 // go go( [1, 2, 3, 4, 5], L.map((n) => Promise.resolve(n)), L.filter((n) => n % 2), take(2), console.log // [1, 3] ); // take export const take = curry((l, iter) => { let result = []; iter = iter[Symbol.iterator](); // recur()가 실행되면, 여기서 다시 시작을 하는데. // iter.next()가 실행되면, return (function recur() { let cur; while (!(cur = iter.next()).done) { const value = cur.value; // a가 promise 인 경우 재귀함수를 이용해서 처리함 if (value instanceof Promise) return ( value // .then((v) => (result.push(v), result).length === l ? result : recur() ) // filter에서 reject가 되면, catch에 걸리고 e가 nop이면 recur()를 실행한다. .catch((e) => (e === nop ? recur() : Promise.reject(e))) ); result.push(value); if (result.length === l) return result; } return result; })(); }); // L.filter const nop = Symbol("nop"); export const L.filter = curry(function* (f, iter) { for (const a of iter) { const b = go1(a, f); if (b instanceof Promise) yield b.then((b) => (b ? a : Promise.reject(nop))); else if (b) yield a; } }); // L.map export const L.Map = curry(function* (f, iter) { for (const el of iter) { yield go1(el, f); } }); 평가 순서 take 함수 내, iter.next() 평가를 시도 → L.filter로 이동 L.filter 내, iter.next() 평가를 시도 → L.map 으로 이동 L.map 내, inter.next() 평가를 시도한다. → [1, 2, 3..] 를 iter 로 받았기 때문에 1로 평가 된다. L.filter 로 돌아와, L.map으로부터 평가받은 Promise.resolve(1) 이라는 값(b)으로 내부 로직을 수행한다. b의 인스턴스가 Promise라면, b.then을 실행하고 a 또는 Promise.reject 을 한다. 여기서 a는 Promise 이다. b의 인스턴스가 Promise가 아니라면, result.push(value); 을 실행하고 while로 순회한다. L.filter 의 평가가 끝나면 take 함수로 돌아온다 take로 전해지는 L.filter 의 평가값은 4개 중에 하나일 것이다. a → take 내에서 result.push 가 실행됨 Promise.resolve(a) → take 내에서 .then 절 이 실행됨. Promise.reject(nop) → take 내에서 .catch 절 이 실행되고 recur() 를 실행함 Promise.reject(e) → take 내에서 .catch절 이 실행되고, Promise.reject(e) 로 이어짐 recur() 가 실행되면, take 에서 실행된 첫번째 while 사이클이 끝나면서, 다시 recur()가 실행되며 iter.next() 가 평가할때 위 과정을 다시 반복한다. take에 있는 while 사이클이 return되고 recur() 함수 실행이 종료됐음에도 iter.next() 의 값이 이전값에서 이어지는 이유는 recur() 와 iter가 클로저이기때문이다.
안녕하세요? 좋은강의를 무료로 공개해 주셔서 감사한 마음으로 잘 듣고있습니다! 공부하다 map, filter, reduce에 비해 group_by, count_by함수는 좋다는 느낌이 들지 않아서 답답함을 해소할 수 있을까 싶어 질문 드립니다. 제가 그냥 생각해 봤을때는 group_by를 통해 멋지게 그룹핑을 했다면 그 결과를 reduce와 같은 함수를 이용해서 집계를 하는게 좋다고 생각을합니다. 예를들어서 다음과 같이 동작했으면 좋겠습니다. _go( [{a:1, b:1}, {a:2, b:2}, {a:3, b:1}, {a:4, b:3}], list => _group_by(list, obj=>obj.b), grouped => _group_reduce(grouped, (a_sum, obj)=>a_sum+obj.a, 0), console.log, ) // 결과 { '1': 4, '2': 2, '3': 4, } 이런 저의 바람과는 달리 카운팅 이라는 단순한 동작을 위해서도 새롭게 'count_by함수를 만들어 낸다'는점이 앞에서 배운 '함수형'이라는 느낌이 나지 않는거 같습니다. 이렇게 된다면 위의 예제와 같이 group_by된 결과에서 a의 값을뽑아 모두 더하는 작업을 하려면 '_group_by_add_a'와 같은 함수를 만들어야 하고, 또 다른 작업을 하려면 또 새롭게 무언가를 만들어내야 할 거 같습니다. 그리고 map, filter, reduce등은 array like를 만들어 내고 이 결과는 go를통해 계속하여 연결해 쓸 수 있는 느낌이었지만, group_by, count_by는 객체를 리턴해 버려서 더이상의 진행은 없는 느낌이 듭니다. (물론 Object.values후 flat 하면 다시 Array가 되긴 합니다만, 이렇게 해버리면 에초에 그룹으로 묶은 의미가 사라지는게 아닐까 합니다.) 위와같이 그룹에 대해서 또 다시 연산하는 무언가를 나중에 배우는 건가요? 아니면 함수형은 마지막을 만들어둔 집계함수로 마무리하는게 끝인 건가요? 그리고 return이 객체인 경우 그 이후 진행을 어떻게 하는게 좋은지도 궁금합니다. 감사합니다.