LoginSignup
1
0

More than 3 years have passed since last update.

Flutter 同じ名前のクラスをimportするには?

Posted at

クラスの名前衝突を避けるには?

まぁ結論として、同じ名前のクラスを作らなければいいだけの話なのですが、、:sweat_smile:

どうしても同じ名前のクラスを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する必要がないからです!

お好きな方をどうぞ!:grin:

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0