プログラム学習室 http://studyhallweb.com/

Dart言語: 複数ソースファイルのプログラム

import

少し長いプログラムになるとソースファイルを複数に分けたくなります。機能別にファイルを分ければ使いまわしもしやすくなりますから。
pubspec.yamlを使ってpackageを作るようですが、この方法がなかなか理解できなかったので(単に英語が読めないだけ)、簡単な方法から確認しました。
まずはimportで単純にソースファイルを読み込む方法から。

(1). test020.dart, lib01.dartを同じディレクトリに作成します。
(2). test020.dart に main() を持たせ、lib01.dartを import します。
// [test020.dart]
import 'lib01.dart';

void main() {
  C_lib01 cLib01 = new C_lib01();
  cLib01.prn('ok');

  print('main:ok');
}
// [lib01.dart]
class C_lib01 {
  void prn(var s) {
    print('lib01:$s');
  }
}
importの際にディレクトリを指定すれば、importするファイルは任意の位置に置くことができます。
(例) import '../lib/lib01.dart';

ただし、この方法で出来るのは一つのファイルのみです
lib02.dart を作成し、lib01.dart 同様に import すると、動作はしますが、ソースコードの lib02.dart を import することろに should not have the same name という警告がでます。
// [test020.dart]
import '../lib/lib01.dart';
import '../lib/lib02.dart';    // この行に対して警告が表示される

void main() {
  C_lib01 cLib01 = new C_lib01();
  cLib01.prn('ok');

  C_lib02 cLib02 = new C_lib02();
  cLib02.prn('ok');

  print('main:ok');
}

library

複数のファイルを警告なしに import するには、library を使えばよいようです。
import するファイルの先頭に library ****; で自分は **** という library だと宣言させます。
このとき同じ library 名を指定すると上の例と同じ警告が出ますので、それぞれの library 名を変えます。
// [test020.dart]
import '../lib/lib01.dart';
import '../lib/lib02.dart';

void main() {
  C_lib01 cLib01 = new C_lib01();
  cLib01.prn('ok');

  C_lib02 cLib02 = new C_lib02();
  cLib02.prn('ok');

  print('main:ok');
}
// [lib01.dart]
library lib01;

class C_lib01 {
  void prn(var s) {
    print('lib01:$s');
  }
}
// [lib02.dart]
library lib02;

class C_lib02 {
  void prn(var s) {
    print('lib02:$s');
  }
}

part, part of

part と part of を使えば、一つの library を複数のファイルに分けることが出来ます。
library の主となるファイルの中に part 'ファイル名'; 、副となるファイルに part of ライブラリ名 と指定します。
次の例では、lib02.dart の一部として lib02b.dart を設けています。
// [test020.dart]
import '../lib/lib01.dart';
import '../lib/lib02.dart';

void main() {
  C_lib01 cLib01 = new C_lib01();
  cLib01.prn('ok');

  C_lib02 cLib02 = new C_lib02();
  cLib02.prn('ok');

  C_lib02b cLib02b = new C_lib02b();
  cLib02b.prn();

  print('main:ok');
}
// [lib01.dart]
library lib01;

class C_lib01 {
  void prn(var s) {
    print('lib01:$s');
  }
}
// [lib02.dart]
library lib02;

part 'lib02b.dart';

class C_lib02 {
  void prn(var s) {
    print('lib02:$s');
  }
}
// [lib02b.dart]
part of lib02;

class C_lib02b {
  void prn() {
    print('part of lib02');
  }
}