What is the difference between show
and as
in an import statement?
For example, what's the difference between
import 'dart:convert' show JSON;
and
import 'package:google_maps/google_maps.dart' as GoogleMap;
When do I use show
and when should I use as
?
If I switch to show GoogleMap
all references to GoogleMap
(e.g. GoogleMap.LatLng
) objects are reported as undefined.
Method that is used in connection with the transport of an object into a different system. The after-import method is called in the target system after the object has been imported. The after-import method is object specific and, therefore, you have to rewrite it for every object type.
To import java package into a class, we need to use java import keyword which is used to access package and its classes into the java program. Use import to access built-in and user-defined packages into your java source file so that your class can refer to a class that is in another package by directly using its name.
When you create a new library and use other libraries you want to make available automatically when using your package, then you use export : library mylib; export 'otherlib.dart'; // Definitions. You can use the show keyword to import/export only some parts of a library (like a class or something).
Dart has a rich set of core libraries that provide essentials for many everyday programming tasks such as working on collections of objects ( dart:collection ), making calculations ( dart:math ), and encoding/decoding data ( dart:convert ). Additional APIs are available in commonly used packages.
as
and show
are two different concepts.
With as
you are giving the imported library a name. It's usually done to prevent a library from polluting your namespace if it has a lot of global functions. If you use as
you can access all functions and classes of said library by accessing them the way you did in your example: GoogleMap.LatLng
.
With show
(and hide
) you can pick specific classes you want to be visible in your application. For your example it would be:
import 'package:google_maps/google_maps.dart' show LatLng;
With this you would be able to access LatLng
but nothing else from that library. The opposite of this is:
import 'package:google_maps/google_maps.dart' hide LatLng;
With this you would be able to access everything from that library except for LatLng
.
If you want to use multiple classes with the same name you'd need to use as
. You also can combine both approaches:
import 'package:google_maps/google_maps.dart' as GoogleMap show LatLng;
show
case:
import 'dart:async' show Stream;
This way you only import Stream
class from dart:async
, so if you try to use another class from dart:async
other than Stream
it will throw an error.
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
case:
import 'dart:async' as async;
This way you import all class from dart:async
and namespaced it with async
keyword.
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
is usually used when there are conflicting classes in your imported library, for example if you have a library 'my_library.dart' that contains a class named Stream
and you also want to use Stream
class from dart:async
and then:
import 'dart:async';
import 'my_library.dart';
void main() {
Stream stream = new Stream.fromIterable([1, 2]);
}
This way, we don't know whether this Stream class is from async library or your own library. We have to use 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
}
For show
, I guess this is used when we know we only need a specific class. Also can be used when there are conflicting classes in your imported library. Let's say in your own library you have a class named CustomStream
and Stream
and you also want to use dart:async
, but in this case you only need CustomStream
from your own library.
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
}
Some workaround:
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
and show
keywords used with library import statement. These two keywords are optional with import
keyword, But using these keywords you can provide convenience and additional information about your library importing.
show
show
give restrictions to access only specific class of that library.
import 'dart:convert' show JSON;
Above dart:convert library contains more than 5 types of converters. (ascii,Base64,Latin1,Utf8 & json are some of them).
But with using show
keyword you will give your application source file to access only that JSON converter class only.
warning !! :- if you try to access any other converters like ascii, Base64 or Latin1, you will get an exception.
Because using show
keyword you give an restriction for only access Json class in that library api.
So if your source file want to access all the class in that library, you cannot define show
keyword for that library importing.
as
Provide additional namespace for library members.
This as
keyword is mostly used when a library that contains lot of global functions.
You will access static members of a library by Using the class name and . (dot operator). eg:- ClassName.staticFun()
And also you will access instance methods and variables by using object name and . (dot operator) eg:- obj.instanceFunc()
And also library source file can have global functions. and we will access them by their name without any parental membership. eg:- func()
So when we access global functions of a different library inside our source file, we didnt have a way to seperatly identified that global function as seperate function of a different library.
But using as
keyword, we can add namespace before accessing global functions of that library.
See below example to understanding real benefit of as
keyword. 👇
import 'package:http/http.dart' as http;
http library contains lot of global functions. Below shows list of global functions in http library.
Accessing above http library global functions without http namespace.( import 'package:http/http.dart';
)
eg:-
1. get("url")
2. post("url")
Accessing above http library global functions with http namespace. ( import 'package:http/http.dart'as http;
)
eg:-
1. http.get("url")
2. http.post("url")
So using as
keyword , makes it easy to identify global functions of a different library separated from our source files' global functions.
I prefer the dart document, it's described in Libraries and visibility section.
import as
: Specifying a library prefix, for example when import two libraries which has the same function name, then we can give them a prefix to specify the library.import show
: This is used to import part of the library, show
only import one name of the library.import hide
: This is another one which is the opposite of the show
, hide
import all names except the name specified in the hide
.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With