【超簡単】2種類ある!Dartにおける名前衝突の解決方法について

Dart

概要


「サードパーティ製のパッケージ入れたらメソッド名ぶつかって入れられん…」

あまり多くはないかもしれませんが、同じ名前のクラスやメソッド二つ。
それぞれを同じファイルでimportして使用する場合、名前解決が出来ずコンパイルエラーが起きます。

具体的には以下の様な場合です。

// sample_a.dart
class Foo {
  final int value;
  
  const Foo(this.value);
}

class Bar {
  final int value;

  const Bar(this.value);
}
// sample_b.dart
class Foo {
  final String value;

  const Foo(this.value);
}
// main.dart
import './sample_a.dart';
import './sample_b.dart';

void main() {
// ここでコンパイルエラー
//  Foo(1);
}

この様な場合に、両ファイルで定義されているのはFooクラスです。
main.dartとしては、どちらのFooを使って良いかわかりません。

こんな時に名前解決をする手段は二つあります。

showキーワードを使う

「実は、sample_a.dartをimportしたのはBarクラスが使いたかっただけなんです…。」

そんな時はこちらの解決策が有効です。

// main.dart
import './sample_a.dart' show Bar;
import './sample_b.dart';

void main() {
  Foo("1"); // コンパイル出来る
}

この様にすると、mainにはBarしか読み込まれず、無事にFooが解決出来ます。

asキーワードを使う

「ワシは、両方のFooクラスを使いたいんじゃ!」

そんなあなたにはこちらの解決策が有効です。

// main.dart
import './sample_a.dart' as a;
import './sample_b.dart';

void main() {
  var a = a.Foo(1);
  var b = Foo("1");
}

この様に名前空間の様なものを定義する事が出来ます。
これで無事に名前解決が出来ます。

誰かのお役に立てば。

コメント

タイトルとURLをコピーしました