조건부 임포트.
말 그대로 조건에 따라 임포트 하는 구문.
일반적으로 단 한가지의 사용 방법 = 멀티플랫폼 프로젝트에서 웹과 웹 이외의 환경을 구분하기 위해서만 사용한다.
export 'src/hw_none.dart' // Stub implementation
if (dart.library.io) 'src/hw_io.dart' // dart:io implementation
if (dart.library.html) 'src/hw_html.dart'; // dart:html implementation
굉장히 잘못 사용하기 쉬운 구문이라 절대 남용하면 안된다.
위 코드의 뜻은.
'src/hw_none.dart' 을 export한다. (import로 바꾸면 import 한다.)
근데, dart.library.io 라이브러리를 이용 가능하면 'src/hw_io.dart' 를 export한다.
만약, dart.library.html 을 이용 가능하면 'src/hw_html.dart' 를 export 한다.
여기서 이용 가능 이라는 것을 주의해야 한다. '임포트 되었으면' 이 아니다.
라이브러리 가용성이 분기되는 경우는 흔하지 않다.
플러터 sdk에서는 dart:ui 와 core 라이브러리는 모든 환경에서 사용가능하고,
웹 환경에서는 dart:html, dart:js, dart:js_util 라이브러리를
non-웹 환경에서는 VM 라이브러리를 사용 가능하다.
그러니 위 구문에서 dart.library.io 를 dart.library.ffi 같은 걸로 바꿔도 동일한 결과가 나온다.
여기서, 이런 질문을 하는 사람이 있을 수 있다.
어차피 웹 환경 분기를 하려면 kIsWeb 을 써서 하면 되는데 왜 이런 복잡한 걸 써야하죠?
kIsWeb 은 웹에서 사용하도록 앱이 컴파일 되었으면 true를 반환하고, 아니면 false를 반환하는 상수이다.
kIsWeb 에는 두 가지 문제가 있다.
그러니 사실상 반 강제적으로 이런 구문을 사용해야 한다.
아래 레포에서 좋은 예시를 확인할 수 있다.
https://github.com/pspgt/cross_picker
다트 공식 사이트
관련 스택오버플로우 질문
미디엄 자료
https://medium.com/@dvargahali/dart-2-conditional-imports-update-16147a776aa8
https://medium.com/flutter-community/conditional-imports-across-flutter-and-web-4b88885a886e
kIsWeb
https://api.flutter.dev/flutter/foundation/kIsWeb-constant.html