web-dev-qa-db-fra.com

Quelle est la différence entre "afficher" et "en tant que" dans une déclaration d'importation?

Quelle est la différence entre show et as dans une instruction d'importation?

Par exemple, quelle est la différence entre

import 'Dart:convert' show JSON;

et

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

Quand dois-je utiliser show et quand dois-je utiliser as?

Si je passe à show GoogleMap toutes les références à GoogleMap (par exemple GoogleMap.LatLng) les objets sont signalés comme non définis.

50
nick

as et show sont deux concepts différents.

Avec as, vous donnez un nom à la bibliothèque importée. Cela est généralement fait pour empêcher une bibliothèque de polluer votre espace de noms si elle a beaucoup de fonctions globales. Si vous utilisez as, vous pouvez accéder à toutes les fonctions et classes de ladite bibliothèque en y accédant comme vous l'avez fait dans votre exemple: GoogleMap.LatLng.

Avec show (et hide), vous pouvez choisir des classes spécifiques que vous souhaitez voir visibles dans votre application. Pour votre exemple, ce serait:

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

Avec cela, vous pourrez accéder à LatLng mais à rien d'autre à partir de cette bibliothèque. L'opposé de ceci est:

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

Avec cela, vous seriez en mesure d'accéder à tout à partir de cette bibliothèque à l'exception de LatLng.

Si vous souhaitez utiliser plusieurs classes avec le même nom, vous devez utiliser as. Vous pouvez également combiner les deux approches:

import 'package:google_maps/google_maps.Dart' as GoogleMap show LatLng;
68
Dennis Kaselow

Cas show:

import 'Dart:async' show Stream;

De cette façon, vous importez uniquement la classe Stream à partir de Dart:async, donc si vous essayez d'utiliser une autre classe de Dart:async autre que Stream, il générera une erreur.

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
}

Cas as:

import 'Dart:async' as async;

De cette façon, vous importez toutes les classes de Dart:async et l'espace de noms avec le mot clé 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 est généralement utilisé lorsqu'il y a des classes en conflit dans votre bibliothèque importée, par exemple si vous avez une bibliothèque 'my_library.Dart' qui contient une classe nommée Stream et que vous souhaitez également utiliser Stream de Dart:async puis:

import 'Dart:async';
import 'my_library.Dart';

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

De cette façon, nous ne savons pas si cette classe Stream provient de la bibliothèque asynchrone ou de votre propre bibliothèque. Nous devons utiliser 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
}

Pour show, je suppose que cela est utilisé lorsque nous savons que nous n'avons besoin que d'une classe spécifique. Peut également être utilisé lorsqu'il existe des classes en conflit dans votre bibliothèque importée. Disons que dans votre propre bibliothèque, vous avez une classe nommée CustomStream et Stream et que vous souhaitez également utiliser Dart:async, mais dans ce cas, vous n'avez besoin que de CustomStream à partir de votre propre bibliothèque.

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
}

Quelques solutions:

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
}
11
Faris Nasution