How to reference another file in Dart?
Asked Answered
I

4

116

I know you can use the library, import and even #import, but which is correct?

I have got two files, MainClass.dart and Library.Dart, and I want to add a reference to Library.dart in MainClass.dart. How can I do that?

Intention answered 18/10, 2012 at 10:0 Comment(0)
F
163

Firstly let me just preface this by saying please do not use the hash symbol before import or library or anything else. This is an old syntax that is being deprecated. So we no longer want to use #import('...') The correct syntax is:

import 'some_file.dart';

That said, there are two different things we can do to access different dart source files within our current file. The first is to import the file. We use this such as in your case when you want to bring a different library into the current file (or more accurately current library).

Usually if your files are in the same directory, or a sub directory of the current one we would import them like this:

import 'lib/library.dart';

However If you are using the pub package layout you can also use some special short-cut references as well to import files (particularly from other packages you've imported). I highly suggest reading the documents on the pub site, as most applications and libraries are designed with this in mind. It also has suggestions on best naming conventions such as filenames in all lower case, and using underscore for spaces, and directory layouts.

The other important thing to know about bringing a dart file into another file, is that we can use the part and part of directives. This used to be called #source but was changed (with the removal of the hash sign) to reduce confusion. The part directive is used when we want to write a single library which spans multiple files. Say for instance you have an Awesome Library, which is starting to get a little large for a single file. We will create the main file of the library (not to be confused with the main method). This file will usually have the same name as the library itself.

// awesome_library.dart
library awesome_library;

import 'dart:math';
import '...';

// this injects all the content of secret_file.dart
// into this file right here almost as if it was
// here in the first place.
part 'src/secret_file.dart';

// The rest of our file here
// ...

The part directive basically takes everything from our src/secret_file.dart and inserts it into that part of the file. This allows us to split our huge Awesome Library into multiple smaller files that are easier to maintain. While not specifically required, it is helpful to use the part of directive in our secret_file.dart to help the editor know that it is "part of" the library.

// secret_file.dart
part of awesome_library;

// ... Rest of our secret_file code below.

Note that when using a part file like this, the part(s) (that is everything that is not the main file of the library) cannot import or use library declarations themselves. They import whatever is imported into the the main file, but they cannot add any additional imports.

For more information about library see this link.

Froissart answered 18/10, 2012 at 13:15 Comment(0)
D
29

Importing your own created libraries: You will be importing the filename.dart and not the name of your library. So if the name of your library is: myLib and it is saved in the file: someDartFile.dart you will have to

import 'someDartFile.dart';

If you have on Windows a library at: K:\SomeDir\someFile.dart you will need to write:

import '/K:/SomeDir/someFile.dart';

example:

import 'LibraryFile.dart'; //importing myLib

void main(){ 
  //a class from myLib in the LibraryFile.dart file
  var some = new SomeClassFromMyLibrary(); 
}

myLib in LibraryFile.dart:

library myLibrary;
import 'dart:math';

class SomeClassFromMyLibrary{
  String _str = "this is some private String only to myLibrary";
  String pubStr = "created instances of this class can access";
}

Here a full example.

//TestLib.dart
import 'LibFile.dart'; //SomeLibrary

void main() {
  print("Hello, World!");

  LibFile l = new LibFile();
  print(l.publicString);//public
  print(l.getPrivateString);//private  
  print(l.getMagicNumber); //42
}

//LibFile.dart
library SomeLibrary;
part 'LibFile2.dart';

class LibFile {
  String _privateString = "private";
  String publicString = "public";

  String get getPrivateString => _privateString;

  int get getMagicNumber => new LibFile2().number;
}

//LibFile2.dart
part of SomeLibrary;

class LibFile2 {
  int number = 42;
}
Degrading answered 18/10, 2012 at 10:33 Comment(3)
what if you dont have a libary but just a new Dart file with classes, would this still work?Intention
As i remember in dart is everything a library. Even your application with main(). But i remember having the same thoughts as you :). Why do i need a lib if i just want to create an object from another class/file. But it works.Degrading
Just to confirm - it's only a library if you have the "library" definition at the top. A script can have a main() function without also being a library.Earful
P
13

Although i am answering very late, but the answer may help new developer.

Always use pubspec.yaml file in your dart package(application/library).

once you run pub get command it will add your local library in the dependencies list in .packages file.

Consider i have following project structure.

enter image description here

To refer to the content of greeting.dart in my main.dart file i should add the library as below

import 'package:my_project_name/greeting.dart'

Once imported we can use the content of greeting.dart file in our main.dart file. Note: we have not used the actual path as you can see 'lib' directory is missing.

Philippic answered 9/4, 2019 at 10:32 Comment(1)
when you instantiate any object of class in that file , IDE automatically generate import path for you.No need to type.Terreverte
S
0

First make sure that's the name which you have mentioned in pubspec.yaml and the file you want to import are sharing the exact same name

example:

pubspec.yaml

name: flutter_wordpress_app
description: flutter wordpress app
...
....
// dirOne/dirTwo/greeting.dart

class FavArticleBloc {
   // Your code goes here
}


import 'package:flutter_wordpress_app/dirOne/dirTwo/greeting.dart'

void main(){ 
  var some = new FavArticleBloc(); 
}

But in the main.dartyou don't need to specify import 'package:flutter_wordpress_app just do like below

import 'dirOne/dirTwo/greeting.dart
Samford answered 20/3, 2020 at 12:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.