クラスの名前衝突を避けるには?
まぁ結論として、同じ名前のクラスを作らなければいいだけの話なのですが、、
どうしても同じ名前のクラスをimportするしかない場合、どうしたら良いか?を調べると、とっても簡単だったのでご紹介!
やり方は2パターンある
下記のような3つのファイルがあったとする。
main.dart
import '../providers/cart.dart';
import '../widgets/cart_item.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// providers/cart.dartからCartクラスをimportしてる
final cart = Provider.of<Cart>(context);
// 省略
Expanded(
child: ListView.builder(
// widgets/cart_item.dartからCartItemクラスをimportしてる
itemBuilder: (ctx, i) => CartItem(
//
),
),
)
}
}
/providers/cart.dart
class CartItem {
final String id;
final String title;
final int quantity;
final double price;
CartItem({
@required this.id,
@required this.title,
@required this.quantity,
@required this.price,
});
}
class Cart with ChangeNotifier {
}
/widgets/cart_item.dart
class CartItem extends StatelessWidget {
final String id;
final double price;
final int quantity;
final String title;
CartItem(
this.id,
this.price,
this.quantity,
this.title,
);
@override
Widget build(BuildContext context) {
}
CartItem
という名のクラスが2つ存在しており、main.dartでは同じ名前のクラスが2つimportされていることになる。。。
こういう場合、やり方は2通りあります。
asキーワードを使う
main.dart
import '../providers/cart.dart';
import '../widgets/cart_item.dart' as wCart;
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// providers/cart.dartからCartクラスをimportしてる
final cart = Provider.of<Cart>(context);
// 省略
Expanded(
child: ListView.builder(
// widgets/cart_item.dartからCartItemクラスをimportしてる
itemBuilder: (ctx, i) => wCart.CartItem(
//
),
),
)
}
}
as
を使うことで、import時のどちらか一方のクラスを擬似的に変えることができます。
showキーワードを使う
main.dart
import '../providers/cart.dart' show Cart;
import '../widgets/cart_item.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// providers/cart.dartからCartクラスをimportしてる
final cart = Provider.of<Cart>(context);
// 省略
Expanded(
child: ListView.builder(
// widgets/cart_item.dartからCartItemクラスをimportしてる
itemBuilder: (ctx, i) => CartItem(
//
),
),
)
}
}
今回の例では/providers/cart.dart
に「CartItemクラス」と「Cartクラス」の2つが存在していました。それが原因でmain.dartで名前解決ができないエラーが発生していました。。
ということは、/providers/cart.dart
から「Cartクラス」だけimportできれば解決ですね?
なぜなら使いたいのは「Cartクラス」だけで、cart_item.dart
で定義てるクラスと名前が被ってる「CartItemクラス」はimportする必要がないからです!
お好きな方をどうぞ!