问题描述
导入语句中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是两个不同的概念.
使用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以外的其他类,则会丢弃错误.
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",并且您还需要从中使用Stream类dart:async,然后:
import 'dart:async'; import 'my_library.dart'; void main() { Stream stream = new Stream.fromIterable([1, 2]); }
这样,我们不知道该流类是来自异步库还是您自己的库.我们必须使用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 }
其他推荐答案
as和show库导入语句中使用的关键字.这两个关键字是带有import关键字的可选的,但是使用这些关键字,您可以提供有关图书馆导入的便利性和其他信息.
show
show给出仅访问该库的特定类别的限制.
import 'dart:convert' show JSON;
飞镖上方:转换库包含5种以上类型的转换器. (ASCII,Base64,Latin1,UTF8和JSON是其中的).
但是使用show关键字,您将提供应用程序源文件仅访问JSON Converter类.
警告! : - 如果您尝试访问ASCII,Base64或Latin1等其他任何转换器,则将获得例外. 因为使用show关键字,您只能在该库中只访问JSON类.
因此,如果您的源文件要访问该库中的所有类,则无法定义该库导入的show关键字.
as
为图书馆成员提供其他名称空间.
此as关键字主要是在包含大量全局函数的库时使用的.
-
您将使用类名和. (点运算符). 例如: - className.staticfun()
-
,您还将使用对象名称和. (点运算符)例如:-OBJ.InstanceFunc()
-
,库源文件也可以具有全局函数.我们将以他们的名字访问他们,而无需任何父母会员资格.例如: - func()
因此,当我们访问源文件中其他库的全局函数时,我们没有办法将全局函数识别为其他库的单独函数.
但是使用as关键字,我们可以在访问该库的全局功能之前添加名称空间.
请参见以下示例,以了解as关键字的真正好处.👇
import 'package:http/http.dart' as http;
HTTP库包含许多全局功能.下面显示了HTTP库中的全局功能列表.
-
访问http库全局函数上方没有 http namespace.(import 'package:http/http.dart';)
eg:- 1. get("url") 2. post("url")
-
使用 http名称空间访问HTTP库全局函数. (import 'package:http/http.dart'as http;)
eg:- 1. http.get("url") 2. http.post("url")
因此,使用as关键字,可以轻松识别与源文件的全局函数分开的其他库的全局功能.