2012-06-03 1 views
0

Je ne pense pas avoir compris ce message d'erreur. Cela signifie-t-il que my_file.dart provient déjà d'un autre fichier, par exemple? my_main.dart contient:Cette source a été incluse par my_file.dart via une directive #source, elle ne peut donc pas contenir elle-même de directives

#source('my_file.dart'); 

et my_file.dart ne peut donc pas générer d'autres fichiers? par exemple, dans my_file.dart.

#source('my_other_file.dart'); // this can't be here? 

class MyClass { 
    Collection<MyOtherClass> myVariables; 
} 

La chose est, je dois la source my_other_file.dart en my_file.dart parce qu'il donne des erreurs de « pas ce type » pour les classes en my_other_file.dart si je ne le fais pas. Mais quand je le fais, j'obtiens cette erreur de titre, "Cette source a été incluse par my_file.dart via une directive #source, donc elle ne peut pas contenir elle-même de directives".

Ai-je complètement mal interprété ce message? Comment puis-je faire cesser ces erreurs?

Répondre

3

Votre compréhension est juste, un fichier #source -d ne peut pas #source d'autres fichiers. Mais voyons plus loin: Dart supporte les bibliothèques. Par exemple, si vous utilisez Dart sur le serveur, vous utiliserez probablement la bibliothèque dart:io (en écrivant #import('dart:io') dans votre code). Si vous utilisez Dart dans le navigateur, vous utiliserez probablement la bibliothèque dart:html. La bibliothèque dart:core est implicitement importée dans chaque programme.

Vous pouvez bien sûr écrire vos propres bibliothèques. Dans la plupart des cas, une bibliothèque s'étendra sur plus d'un fichier. Dans ce cas, un de ces fichiers sera quelque peu principal: il déclarera la bibliothèque (en utilisant #library), spécifier toutes les dépendances (en utilisant #import) et tous les autres fichiers source (en utilisant #source). Tous les autres fichiers (ceux #source -d) ne contiendront que le code Dart et aucun d'entre eux ne peut contenir ces directives #library, #import et #source. Il peut ressembler à ceci:

my_lib.dart:

#library('My Library'); 

#source('my_lib_impl.dart'); 

interface MyInterface default _MyClass { 
    foo(); 
} 

my_lib_impl.dart:

class _MyClass implements MyInterface { 
    foo() { 
    print("foo!"); 
    } 
} 

Ensuite, si vous souhaitez utiliser cette bibliothèque dans votre programme, vous doivent#import le fichier my_lib.dart. Vous ne pas#source il.

my_program.dart:

#import('my_lib.dart'); 

main() { 
    new MyInterface().foo(); 
} 

Notez que ici, même si my_program.dart ne contient pas une directive #library, il fonctionne comme un - il peut #import et #source fichiers. Vous pouvez le faire dans le script "entrypoint".

J'ai essayé d'expliquer comment utiliser les librairies dans Dart, ce qui n'est pas une réponse directe à votre question, mais ça devrait aider. Sinon, faites le moi savoir et je vais essayer de creuser plus profondément.

2

Ladicek a l'explication complète.En ce qui concerne votre problème spécifique:

Je dois la source my_other_file.dart en my_file.dart parce qu'il donne des erreurs de « pas ce type » pour les classes en my_other_file.dart si je ne le fais pas. Mais quand je le fais, j'obtiens cette erreur de titre, "Cette source a été incluse par my_file.dart via une directive #source, donc elle ne peut pas contenir elle-même de directives".

Le correctif est: au lieu de mettre en #source('my_other_file.dart')my_file.dart, le mettre dans my_main.dart.

Nous, de l'équipe Dart, sommes conscients que c'est l'un des coins les plus confus de la langue, et nous travaillons pour essayer de trouver quelque chose de mieux, mais cela prend du temps.

Questions connexes