import语句中"show"和"as"之间有什么区别?

nic*_*ick 43 dart dart-editor

import语句showasimport语句之间有什么区别?

例如,有什么区别

import 'dart:convert' show JSON;
Run Code Online (Sandbox Code Playgroud)

import 'package:google_maps/google_maps.dart' as GoogleMap;
Run Code Online (Sandbox Code Playgroud)

show何时使用,何时使用as

如果我切换到show GoogleMap所有引用GoogleMap(例如GoogleMap.LatLng)对象被报告为未定义.

Den*_*low 81

as并且show是两个不同的概念.

随着as您为导入的库提供一个名称.通常这样做是为了防止库在您拥有大量全局函数时污染您的命名空间.如果您使用,as您可以通过您在示例中的方式访问它们来访问所述库的所有功能和类:GoogleMap.LatLng.

使用show(和hide),您可以选择要在应用程序中显示的特定类.对于你的例子,它将是:

import 'package:google_maps/google_maps.dart' show LatLng;
Run Code Online (Sandbox Code Playgroud)

有了这个,您将能够访问LatLng该库中的其他内容.与此相反的是:

import 'package:google_maps/google_maps.dart' hide LatLng;
Run Code Online (Sandbox Code Playgroud)

有了这个,您将能够访问该库中的所有内容,除了LatLng.

如果要使用具有相同名称的多个类,则需要使用它们as.您还可以结合使用两种方法:

import 'package:google_maps/google_maps.dart' as GoogleMap show LatLng;
Run Code Online (Sandbox Code Playgroud)

  • 隐藏导入函数有什么意义? (2认同)
  • 如果您从 2 个库导入,这两个库都包含同名的函数或类,但您只想使用其中之一而不使用“as”使用别名,那么您将隐藏您不想使用的那个。 (2认同)

Far*_*ion 14

show 案件:

import 'dart:async' show Stream;

这样,你只能导入Stream从类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
}
Run Code Online (Sandbox Code Playgroud)

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'
}
Run Code Online (Sandbox Code Playgroud)

as通常在导入的库中存在冲突类时使用,例如,如果您的库'my_library.dart'包含一个名为的类,Stream并且您还想使用Streamdart:async,则:

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

void main() {
  Stream stream = new Stream.fromIterable([1, 2]);
}
Run Code Online (Sandbox Code Playgroud)

这样,我们不知道这个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
}
Run Code Online (Sandbox Code Playgroud)

因为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
}
Run Code Online (Sandbox Code Playgroud)

一些解决方法:

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
}
Run Code Online (Sandbox Code Playgroud)

  • 使用“show”是否会使应用程序尺寸更小,因为它没有导入其他不需要的东西? (3认同)

Dil*_*han 6

asshow与库导入语句一起使用的关键字。这两个关键字对于关键字是可选的import,但是使用这些关键字可以提供有关库导入的便利和附加信息。


show

show 限制只访问该库的特定类。

import 'dart:convert' show JSON;
Run Code Online (Sandbox Code Playgroud)

以上 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;
Run Code Online (Sandbox Code Playgroud)

http 库包含很多全局函数。下面显示了 http 库中的全局函数列表。

http 库全局函数列表

因此,使用as关键字 , 可以轻松识别与源文件的全局函数分离的不同库的全局函数。