Flutter가 몸에
좋은 이유
개발자 건강을 위한 최고의 방법
Flutter Songdo Organizer (2022 ~ )
GDG Songdo Organizer (2020~ 2023)
Tech Lead @bluefrog (2020 ~ )
Android
Flutter
Back-end + DevOps
I’m an App Developer.
Bio
yangsterchief@duck.com
https://github.com/yangster-chief
https://www.linkedin.com/in/sujang-yang
1. 이 발표는 Flutter가 개발자의 삶과 건강에 미치는 긍정적인 영향에 대한 개인적인 견해를 다룹니다. 다른
의견도 존중하며, 여기서 제시된 내용은 일반화하기 어려울 수 있습니다.
2. 발표에서는 Flutter 사용이 작업량 감소, 스트레스 완화, 워크-라이프 밸런스 개선 등을 통해 개발자의 정신
건강에 이점을 제공한다고 주장할 예정입니다.
3. 활발한 Flutter 커뮤니티와 자료가 개발자에게 지원 체계를 제공하여 정신적 안정에 기여한다는 주장을
펼칠 것입니다.
4. 위 내용들은 개인적인 경험과 의견을 바탕으로 한 것이며, 다른 관점과 반론도 있을 수 있음을 인정합니다.
5. 발표 중에는 실제 사례와 개발자 경험담을 활용하여 주장을 뒷받침할 예정이지만, 이러한 경험 사례가
일반화되기 어려울 수 있습니다.
⚠ 주의사항
작업량 감소와 스트레스
완화
요즘 대세라는 명령형 UI
// Imperative style
b.setColor(red)
b.clearChildren()
ViewC c3 = new
ViewC(...)
b.add(c3)
// Declarative style
return ViewB(
color: red,
child: const ViewC(),
);
One Source Multi Use
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class _MyHomePageState extends State<MyHomePage> {
static const platform = MethodChannel('samples.flutter.dev/battery');
// Get battery level.
String _batteryLevel = 'Unknown battery level.';
Future<void> _getBatteryLevel() async {
String batteryLevel;
try {
final int result = await platform.invokeMethod('getBatteryLevel');
batteryLevel = 'Battery level at $result % .';
} on PlatformException catch (e) {
batteryLevel = "Failed to get battery level: '${e.message}'.";
}
...
class MainActivity: FlutterActivity() {
private val CHANNEL = "samples.flutter.dev/battery"
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
call, result -> // This method is invoked on the main thread.
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
if (batteryLevel != -1) {
result.success(batteryLevel)
} else {
result.error("UNAVAILABLE", "Battery level not available.", null)
}
} else {
result.notImplemented()
}
}
}
}
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery", binaryMessenger: controller.binaryMessenger)
batteryChannel.setMethodCallHandler({
[weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in // This method is invoked on the UI thread.
guard call.method == "getBatteryLevel" else {
result(FlutterMethodNotImplemented)
return
}
self?.receiveBatteryLevel(result: result)
})
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
우리 Flutter 정상영업
합니다
class User {
final String name;
final int age;
User(this.name, this.age);
void printUserInfo() => print('User Name: $name, Age: $age'); // 객체의 정보를 출력하는 메소드
}
Future<String> fetchUserData() {
// 비동기 작업을 시뮬레이션하기 위해 Future.delayed 사용
return Future.delayed(Duration(seconds: 2), () => 'John Doe,30');
}
void main() async {
print('Fetching user data...');
var userData = await fetchUserData(); // 비동기 함수 호출 및 대기
var userDetails = userData.split(',');
var user = User(userDetails[0], int.parse(userDetails[1]));
user.printUserInfo(); // 'User Name: John Doe, Age: 30' 출력
}
66 개국 150개
그룹
Flutter Seoul (서울, 한국(대한민국)) | Meetup
Flutter Songdo (인천, 한국(대한민국)) | Meetup
Flutter Daegu - 플러터 대구 (대구, 한국(대한민국)) | Meetup
Flutter Korea
“여러번 말씀드리지만
여러분들 이제는 Flutter 꼭
하셔야합니다 진짜진짜요”
THANK
YOU!
v

[Native vs Flutter] Flutter가 몸에 좋은 이유 _ 개발자 건강을 위한 최고의 방법.pdf

  • 1.
    Flutter가 몸에 좋은 이유 개발자건강을 위한 최고의 방법
  • 2.
    Flutter Songdo Organizer(2022 ~ ) GDG Songdo Organizer (2020~ 2023) Tech Lead @bluefrog (2020 ~ ) Android Flutter Back-end + DevOps I’m an App Developer. Bio yangsterchief@duck.com https://github.com/yangster-chief https://www.linkedin.com/in/sujang-yang
  • 3.
    1. 이 발표는Flutter가 개발자의 삶과 건강에 미치는 긍정적인 영향에 대한 개인적인 견해를 다룹니다. 다른 의견도 존중하며, 여기서 제시된 내용은 일반화하기 어려울 수 있습니다. 2. 발표에서는 Flutter 사용이 작업량 감소, 스트레스 완화, 워크-라이프 밸런스 개선 등을 통해 개발자의 정신 건강에 이점을 제공한다고 주장할 예정입니다. 3. 활발한 Flutter 커뮤니티와 자료가 개발자에게 지원 체계를 제공하여 정신적 안정에 기여한다는 주장을 펼칠 것입니다. 4. 위 내용들은 개인적인 경험과 의견을 바탕으로 한 것이며, 다른 관점과 반론도 있을 수 있음을 인정합니다. 5. 발표 중에는 실제 사례와 개발자 경험담을 활용하여 주장을 뒷받침할 예정이지만, 이러한 경험 사례가 일반화되기 어려울 수 있습니다. ⚠ 주의사항
  • 4.
  • 8.
  • 10.
  • 11.
    // Declarative style returnViewB( color: red, child: const ViewC(), );
  • 12.
  • 16.
    import 'dart:async'; import 'package:flutter/material.dart'; import'package:flutter/services.dart'; class _MyHomePageState extends State<MyHomePage> { static const platform = MethodChannel('samples.flutter.dev/battery'); // Get battery level. String _batteryLevel = 'Unknown battery level.'; Future<void> _getBatteryLevel() async { String batteryLevel; try { final int result = await platform.invokeMethod('getBatteryLevel'); batteryLevel = 'Battery level at $result % .'; } on PlatformException catch (e) { batteryLevel = "Failed to get battery level: '${e.message}'."; } ...
  • 17.
    class MainActivity: FlutterActivity(){ private val CHANNEL = "samples.flutter.dev/battery" override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> // This method is invoked on the main thread. if (call.method == "getBatteryLevel") { val batteryLevel = getBatteryLevel() if (batteryLevel != -1) { result.success(batteryLevel) } else { result.error("UNAVAILABLE", "Battery level not available.", null) } } else { result.notImplemented() } } } }
  • 18.
    @UIApplicationMain @objc class AppDelegate:FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let batteryChannel = FlutterMethodChannel(name: "samples.flutter.dev/battery", binaryMessenger: controller.binaryMessenger) batteryChannel.setMethodCallHandler({ [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in // This method is invoked on the UI thread. guard call.method == "getBatteryLevel" else { result(FlutterMethodNotImplemented) return } self?.receiveBatteryLevel(result: result) }) GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
  • 19.
  • 23.
    class User { finalString name; final int age; User(this.name, this.age); void printUserInfo() => print('User Name: $name, Age: $age'); // 객체의 정보를 출력하는 메소드 } Future<String> fetchUserData() { // 비동기 작업을 시뮬레이션하기 위해 Future.delayed 사용 return Future.delayed(Duration(seconds: 2), () => 'John Doe,30'); } void main() async { print('Fetching user data...'); var userData = await fetchUserData(); // 비동기 함수 호출 및 대기 var userDetails = userData.split(','); var user = User(userDetails[0], int.parse(userDetails[1])); user.printUserInfo(); // 'User Name: John Doe, Age: 30' 출력 }
  • 28.
  • 29.
    Flutter Seoul (서울,한국(대한민국)) | Meetup Flutter Songdo (인천, 한국(대한민국)) | Meetup Flutter Daegu - 플러터 대구 (대구, 한국(대한민국)) | Meetup Flutter Korea
  • 32.
    “여러번 말씀드리지만 여러분들 이제는Flutter 꼭 하셔야합니다 진짜진짜요”
  • 33.