Importステートメントのshow
とas
の違いは何ですか?
たとえば、違いは何ですか
import 'Dart:convert' show JSON;
そして
import 'package:google_maps/google_maps.Dart' as GoogleMap;
いつshow
を使用し、いつas
を使用する必要がありますか?
show GoogleMap
に切り替えると、GoogleMap
(たとえば、GoogleMap.LatLng
)オブジェクトへのすべての参照が未定義として報告されます。
as
とshow
は2つの異なる概念です。
as
を使用すると、インポートしたライブラリに名前を付けることができます。これは通常、ライブラリに多数のグローバル関数がある場合に、ネームスペースを汚染しないようにするために行われます。 as
を使用する場合、上記のライブラリのすべての関数とクラスに、例で行った方法でアクセスすることでアクセスできます:GoogleMap.LatLng
。
show
(およびhide
)を使用すると、アプリケーションで表示する特定のクラスを選択できます。あなたの例では次のようになります:
import 'package:google_maps/google_maps.Dart' show LatLng;
これにより、LatLng
にアクセスできるようになりますが、そのライブラリからは他に何もアクセスできません。これの反対は:
import 'package:google_maps/google_maps.Dart' hide LatLng;
これにより、LatLng
以外のライブラリからすべてにアクセスできるようになります。
同じ名前の複数のクラスを使用する場合は、as
を使用する必要があります。また、両方のアプローチを組み合わせることができます。
import 'package:google_maps/google_maps.Dart' as GoogleMap show LatLng;
show
ケース:
import 'Dart:async' show Stream;
この方法では、Dart:async
からStream
クラスのみをインポートするため、Stream
以外のDart:async
から別のクラスを使用しようとすると、エラーがスローされます。
void main() {
List data = [1, 2, 3];
Stream stream = new Stream.fromIterable(data); // doable
StreamController controller = new StreamController(); // not doable
// because you only show Stream
}
as
ケース:
import 'Dart:async' as async;
このようにして、Dart:async
からすべてのクラスをインポートし、async
キーワードで名前空間を設定します。
void main() {
async.StreamController controller = new async.StreamController(); // doable
List data = [1, 2, 3];
Stream stream = new Stream.fromIterable(data); // not doable
// because you namespaced it with 'async'
}
as
は通常、インポートされたライブラリに競合するクラスがある場合に使用されます。たとえば、Stream
という名前のクラスを含むライブラリ 'my_library.Dart'があり、Dart:async
のStream
クラスを使用したい場合、次のようになります。
import 'Dart:async';
import 'my_library.Dart';
void main() {
Stream stream = new Stream.fromIterable([1, 2]);
}
このように、このStreamクラスが非同期ライブラリからのものか、独自のライブラリからのものかはわかりません。 as
を使用する必要があります。
import 'Dart:async';
import 'my_library.Dart' as myLib;
void main() {
Stream stream = new Stream.fromIterable([1, 2]); // from async
myLib.Stream myCustomStream = new myLib.Stream(); // from your library
}
show
の場合、これは特定のクラスのみが必要であることがわかっている場合に使用されると思います。インポートしたライブラリに競合するクラスがある場合にも使用できます。自分のライブラリにCustomStream
およびStream
という名前のクラスがあり、Dart:async
も使用したいとしますが、この場合は自分のライブラリのCustomStream
のみが必要です。
import 'Dart:async';
import 'my_library.Dart';
void main() {
Stream stream = new Stream.fromIterable([1, 2]); // not doable
// we don't know whether Stream
// is from async lib ir your own
CustomStream customStream = new CustomStream();// doable
}
いくつかの回避策:
import 'Dart:async';
import 'my_library.Dart' show CustomStream;
void main() {
Stream stream = new Stream.fromIterable([1, 2]); // doable, since we only import Stream
// async lib
CustomStream customStream = new CustomStream();// doable
}