Flutter Tip - ynjch97/YNJCH_WIKI GitHub Wiki

1. WidgetsBinding.instance.addPostFrameCallback

์ƒํ™ฉ

  • ViewModel > Future<void> ํƒ€์ž…์œผ๋กœ ์„ ์–ธ๋œ async ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ
  • View > initState() ์—์„œ Provider.notifier ๋กœ Firebase ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•จ
  • View > ref.watch(Provider).when( ์œผ๋กœ ํ™•์ธํ•จ

์—๋Ÿฌ

FlutterError (Tried to modify a provider while the widget tree was building.
If you are encountering this error, chances are you tried to modify a provider
in a widget life-cycle, such as but not limited to:

์›์ธ

  • Life Cycle ๋ฌธ์ œ๋กœ initState() ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

ํ•ด๊ฒฐ

  • addPostFrameCallback ์œผ๋กœ ๋ ˆ์•„์ด์›ƒ์ด ๋ชจ๋‘ ๊ตฌ์„ฑ๋œ ์ดํ›„ ํ˜ธ์ถœ
  • addPostFrameCallback
    • ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ Rendering ์ด ์™„๋ฃŒ๋œ ์งํ›„, ํ˜ธ์ถœ๋˜๋Š” Callback Method
    • ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ตฌ์„ฑ๋œ ์ดํ›„์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • ๋ ˆ์ด์•„์›ƒ์„ ๋ชจ๋‘ ๊ตฌ์„ฑํ•œ ์ดํ›„, ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _initTimeTable();
    });

์‚ฌ์šฉ ์˜ˆ์‹œ

  • ์œ„์ ฏ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜๋ฅผ ์–ป๊ณ  ์‹ถ์„ ๋•Œ
    • Rendering ๋œ ํ›„, ํฌ๊ธฐ๋‚˜ ์œ„์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๋™์ ์œผ๋กœ ์œ„์ ฏ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒฝ์šฐ
GlobalKey _key = GlobalKey();

@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) => _afterLayout());
}

void _afterLayout() {
  final RenderBox renderBox = _key.currentContext?.findRenderObject() as RenderBox;
  final size = renderBox.size;
  final position = renderBox.localToGlobal(Offset.zero);
  print("Size: $size, Position: $position");
}

@override
Widget build(BuildContext context) {
  return Container(
    key: _key, // ์œ„์ ฏ์— GlobalKey ํ• ๋‹น
    // ์œ„์ ฏ ๊ตฌ์„ฑ
  );
}
  • ์ดˆ๊ธฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹คํ–‰
    • ์•ฑ์ด ์‹œ์ž‘ํ•  ๋•Œ, ํŠน์ • ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) => _startAnimation());
}

void _startAnimation() {
  // ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์ดˆ๊ธฐํ™” ๋ฐ ์‹œ์ž‘ ๋กœ์ง
}
  • ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋ฐ UI ์—…๋ฐ์ดํŠธ
    • ์œ„์ ฏ์ด ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ์‹œ์ ์—, ์™ธ๋ถ€ API๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) => _loadData());
}

void _loadData() async {
  final data = await fetchDataFromNetwork(); // ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œ
  setState(() {
    // ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
  });
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ