ํ์ฌ Flutter๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฐ์ด ๋ถ์ ์(๋๋ ์์คํ ์์ ์์ฑ/์ ๊ณต) ์ ํจ์ฑ์ด ํ์ธ๋์ง ์๋ ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋๊ธฐ ๋๋ฌธ์ ๋ฐํ์ ์ ์์ฐ ๋ก๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค.
ํ์ฌ ๋ผ์ด๋ธ ์ฑ์์ Posse์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ถฉ๋์ ์์ฐ ๋ฌธ์์ด ๋ก๋ ์คํจ์ ๋๋ค.
๊ทธ๋ค์ ๋ํ pubspec.yaml์์ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฌธ์์ด ์์์ ์๋ ํ์ผ์ ๊ฐ์ง๊ณ ์์ต๋๋ค(์๋ง๋ ๊ฝค ์ฝ๊ฒ ์๋ ์์ฑ๋ ์ ์์).
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋์ธ ์ ์๋ ํจํด์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด ๋ฒ๊ทธ๋ ์ด๋ฌํ ์ข ๋ฅ์ ์คํจ ๊ฐ๋ฅ์ฑ์ ์ค์ด๊ธฐ ์ํ ์์ด๋์ด๋ฅผ ์ฐพ๋ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ๋ก @yjbanov
์๋ ค์ง ์์ฐ ์ด๋ฆ ๋ฑ์ ์ด๊ฑฐํ์ ์๋ ์์ฑํ ์ ์์ต๋๋ค.
๋๋ ์ฌ์ ํ ์ด๊ฒ์ ์ ๋ฌํ๊ธฐ๋ฅผ ์ด๋งํ๊ณ , ๋๋ ๊ทธ๊ฒ์ ๋ํ flutter ํ์ ์๊ฒฌ์ด ๋ฌด์์ธ์ง ๊ฒฐ์ฝ ํ์ ํ์ง ๋ชปํ์ต๋๋ค. ๋ด POC๋ ๋ฒ ํ ์์ ๋ถํฐ ๋๊ฒฐ๋์์ต๋๋ค. PR์ด ๋ ์ ์์ ๋งํผ ๊น๋ํ MVP๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๊ณง (TM).
์๋ , ๋ชจ๋:
์ ๋ NetEase ํ์ฌ์ Fly-Mix ํ ์ ์ผ์์
๋๋ค. ์ฐ๋ฆฌ ํ์ ์ฌ๋ฌ๋ถ์ด ์ํ๋ ๊ธฐ๋ฅ์ ์ง์ํ๊ธฐ ์ํด Flutter ๊ฐ๋ฐ ๋๊ตฌ Flr(Flutter-R)
๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
Flr
๋ Flutter ๊ฐ๋ฐ์๊ฐ pubspec.yaml
์ ์์ฐ์ ์๋์ผ๋ก ์ง์ ํ๊ณ Android์์ R.java
๋ฅผ ์ข์ํ๋ r.g.dart
ํ์ผ์ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ Flutter ๋ฆฌ์์ค ๊ด๋ฆฌ์ ๋๊ตฌ์
๋๋ค. ํ๋ฌํฐ ํ๋ก์ ํธ ์์ฐ์ ๋ณ๊ฒฝํฉ๋๋ค. r.g.dart
๋ฅผ ์ฌ์ฉํ๋ฉด flutter ๊ฐ๋ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฐ ID ๊ธฐ๋ฅ์ ์ฐธ์กฐํ์ฌ ์ฝ๋์ ์์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค.
import 'package:flutter_r_demo/r.g.dart';
// test_sameName.png
var normalImageWidget = Image(
width: 200,
height: 120,
image: R.image.test_sameName(),
);
// test_sameName.gif
var gifImageWidget = Image(
image: R.mage.test_sameName_gif(),
);
// test.svg
var svgImageWidget = Image(
width: 100,
height: 100,
image: R.svg.test(width: 100, height: 100),
);
// test.json
var jsonString = await R.text.test_json();
// test.yaml
var yamlString = await R.text.test_yaml();
์ถ์ : ์, Android์ AAPT(Android Asset Packaging Tool)์ ๊ฐ์ต๋๋ค.
์ง๊ธ๊น์ง Flr์ Android Studio ํ๋ฌ๊ทธ์ธ, CLI ๋ฐ VSCode ํ์ฅ์ ์ง์ํ์ต๋๋ค.
Flr Android ์คํ๋์ค ํ๋ฌ๊ทธ์ธ ๋ฒ์
ํ๋ฌ๊ทธ์ธ ํํ์ด์ง: https://plugins.jetbrains.com/plugin/13789-flr
flr-as-plugin ์ฌ์ฉ ์ GIF:
Flr CLI ๋ฒ์
CLI ํํ์ด์ง: https://rubygems.org/gems/flr
flr-cli ์ฌ์ฉ ์ GIF:
Flr VSCode ํ์ฅ ๋ฒ์
ํ์ฅ ํํ์ด์ง: https://marketplace.visualstudio.com/items?itemName=LincolnLaw.flr
flr-vscode-extension ์ฌ์ฉ ์: