2013-11-01 18 views
9

Jaka jest różnica między show i as w poleceniu import?Jaka jest różnica między "pokaż" i "jak" w instrukcji import?

Na przykład, jaka jest różnica między

import 'dart:convert' show JSON; 

i

import 'package:google_maps/google_maps.dart' as GoogleMap; 

Kiedy mogę korzystać show i kiedy należy używać as?

Po przełączeniu na show GoogleMap wszystkie odwołania do obiektów GoogleMap (np. GoogleMap.LatLng) są zgłaszane jako niezdefiniowane.

Odpowiedz

17

as i show to dwie różne koncepcje.

Za pomocą as nadajesz zaimportowanej bibliotece nazwę. Zwykle robi się to, aby biblioteka nie zanieczyściła przestrzeni nazw, jeśli ma wiele funkcji globalnych. Jeśli używasz as, możesz uzyskać dostęp do wszystkich funkcji i klas wspomnianej biblioteki, uzyskując dostęp do nich w sposób opisany w przykładzie: GoogleMap.LatLng.

Z show (i hide) można wybrać konkretne klasy, które mają być widoczne w aplikacji. Na swoim przykładzie będzie to:

import 'package:google_maps/google_maps.dart' show LatLng; 

Dzięki temu będzie można uzyskać dostęp do LatLng ale nic z tej biblioteki. Przeciwieństwem tego jest:

import 'package:google_maps/google_maps.dart' hide LatLng; 

Dzięki temu będzie można uzyskać dostęp do wszystkiego z tej biblioteki z wyjątkiem LatLng.

Jeśli chcesz użyć wielu klas o tej samej nazwie, musisz użyć as. Można również połączyć oba podejścia:

import 'package:google_maps/google_maps.dart' as GoogleMap show LatLng; 
3

show przypadek:

import 'dart:async' show Stream;

ten sposób można importować tylko Stream klasę z dart:async, więc jeśli spróbujesz użyć innej klasy z dart:async inny niż Stream to rzuci błąd.

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 przypadek:

import 'dart:async' as async;

ten sposób można zaimportować wszystkie klasy z dart:async i przestrzeni nazw go async hasła.

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 jest zwykle używany, gdy istnieje konflikt klas w importowanej biblioteki, na przykład, jeśli masz biblioteki „my_library.dart”, który zawiera klasę o nazwie Stream a także skorzystać z dart:asyncStream klasę, a następnie:

import 'dart:async'; 
import 'my_library.dart'; 

void main() { 
    Stream stream = new Stream.fromIterable([1, 2]); 
} 

ten sposób, że nie wiemy, czy ta klasa Stream z biblioteki asynchronicznym lub własnej biblioteki. Musimy wykorzystać 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 
} 

Dla show, myślę, że ten jest stosowany, gdy wiemy, że musimy tylko konkretną klasę. Może być również używany, gdy w zaimportowanej bibliotece znajdują się klasy będące w konflikcie. Załóżmy, że we własnej bibliotece masz klasę o nazwie CustomStream i Stream, ale chcesz też użyć dart:async, ale w tym przypadku potrzebujesz tylko CustomStream z własnej biblioteki.

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 
} 

Niektóre obejście:

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 
}