导入语句中的show
和之间有什么区别?as
例如,有什么区别
import 'dart:convert' show JSON;
和
import 'package:google_maps/google_maps.dart' as GoogleMap;
我什么时候使用show
,什么时候应该使用as
?
如果我切换到对(例如)对象的show GoogleMap
所有引用,则报告为未定义。GoogleMap
GoogleMap.LatLng
导入语句中的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
(and 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;
这样你只导入Stream
类 from dart:async
,所以如果你尝试使用另一个类而dart:async
不是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
通常在导入的库中存在冲突的类时使用,例如,如果您有一个包含名为的类的库“my_library.dart”,Stream
并且您还想使用Stream
类 fromdart:async
然后:
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
and的类,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;
以上 dart:convert 库包含超过 5 种类型的转换器。(ascii、Base64、Latin1、Utf8 和 json 是其中的一部分)。
但是使用show
关键字,您将让您的应用程序源文件仅访问该 JSON 转换器类。
警告 !!:- 如果您尝试访问任何其他转换器,如 ascii、Base64 或 Latin1,您将收到异常。因为使用show
关键字您限制了仅访问该库 api 中的 Json 类。
因此,如果您的源文件想要访问该库中的所有类,则不能show
为该库导入定义关键字。
as
为库成员提供额外的命名空间。
此as
关键字主要用于包含大量全局函数的库时。
您将通过使用类名和 . (点运算符)。例如:- ClassName.staticFun()
您还将使用对象名称和 . (点运算符)例如:- obj.instanceFunc()
并且库源文件也可以具有全局功能。我们将通过他们的名字访问他们,而无需任何父母成员资格。例如:- func()
因此,当我们在源文件中访问不同库的全局函数时,我们没有办法将该全局函数单独标识为不同库的单独函数。
但是使用as
关键字,我们可以在访问该库的全局函数之前添加命名空间。
请参阅下面的示例以了解as
关键字的真正好处。
import 'package:http/http.dart' as http;
http 库包含许多全局函数。下面显示了 http 库中的全局函数列表。
在没有http 命名空间的情况下访问上面的 http 库全局函数。( 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
关键字,可以很容易地识别与我们的源文件的全局函数分开的不同库的全局函数。