【问题标题】:What is the difference between "show" and "as" in an import statement?导入语句中的“show”和“as”有什么区别?
【发布时间】:2013-11-12 10:27:09
【问题描述】:

import 语句中的showas 有什么区别?

比如有什么区别

import 'dart:convert' show JSON;

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

什么时候使用show,什么时候应该使用as

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

【问题讨论】:

    标签: dart dart-editor


    【解决方案1】:

    asshow 是两个不同的概念。

    使用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;
    

    【讨论】:

    • 隐藏导入的函数有什么意义?
    • 如果你从 2 个库中导入,它们都包含同名的函数或类,但你只想使用其中一个而不是使用 as 的别名,那么你会隐藏一个你不想用的。
    【解决方案2】:

    show案例:

    import 'dart:async' show Stream;

    这样你只能从dart:async 导入Stream 类,所以如果你尝试使用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 通常在您导入的库中存在冲突类时使用,例如,如果您有一个包含名为 Stream 的类的库“my_library.dart”,并且您还想使用来自的 Streamdart: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,我想这是在我们知道我们只需要一个特定的类时使用的。当导入的库中存在冲突的类时也可以使用。假设在您自己的库中,您有一个名为 CustomStreamStream 的类,并且您还想使用 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
    }
    

    【讨论】:

    • 使用show 是否会使应用程序变小,因为它不会导入其他不需要的东西?
    • Flutter 和 dart2js,如果不是 Dart,一般会使用 tree-shaking 来缩小 app 的体积。见github.com/dart-lang/sdk/issues/33920
    【解决方案3】:

    asshow 关键字与库导入语句一起使用。这两个关键字在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 库全局函数 with http 命名空间。 (import 'package:http/http.dart'as http;)

       eg:- 
         1.  http.get("url")
      
         2.  http.post("url")
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      相关资源
      最近更新 更多