dart

The argument type ‘Context’ can’t be assigned to the parameter type ‘BuildContext’.エラーについて

エラーが発生した背景

showDialogでダイアログボックスを表示させようと実装したとき

showDialogに必要なcontextの箇所(以下9行目)でブログのタイトルのエラーがでました。


import 'package:flutter/material.dart';
import 'package:path/path.dart';

・・・(省略)

  void buttonPressed() {
    showDialog(
        context: context,   //←この箇所でエラー
        builder: (BuildContext context) => AlertDialog(
          title: Text("Hello!"),
          content: Text("This is sample"),
          actions:[
            FlatButton(
                child: const Text('Cancel'),
                onPressed: () => Navigator.pop(context,'Cancel')
            ),
            FlatButton(
                child: const Text('OK'),
                onPressed: () => Navigator.pop(context,'OK')
            )
          ],
        )
    ).then((value) => resultAlert(value));
  }

結論

インポート「package:path/path.dart」に

”as (任意の名前)”をつけることで解消します。


import 'package:flutter/material.dart';  
import 'package:path/path.dart' as p;  //←ここにasをつける

・・・(省略)

  void buttonPressed() {
    showDialog(
        context: context,   
        builder: (BuildContext context) => AlertDialog(
          title: Text("Hello!"),
          content: Text("This is sample"),
          actions:[
            FlatButton(
                child: const Text('Cancel'),
                onPressed: () => Navigator.pop(context,'Cancel')
            ),
            FlatButton(
                child: const Text('OK'),
                onPressed: () => Navigator.pop(context,'OK')
            )
          ],
        )
    ).then((value) => resultAlert(value));
  }

原因

dart標準フレームワークにContextという変数が使われています。

ただ、「’package:path/path.dart’」(以降 path.dart)

にもContextという変数が別の用途で使われています。

今回の例では

フレームワークのContextを使用すべき箇所で

path.dartのContextを使用されているため、

以下のメッセージがでました。

The argument type ‘Context’ can’t be assigned to the parameter type ‘BuildContext’.
(引数タイプ「Context」をパラメータタイプ「BuildContext」に割り当てることはできません。)

そのため、

import ‘package:path/path.dart’ の後ろに as (任意の名前)

をつけることで、

フレームワーク標準のContextを使う場合は

context
(そのままでよい)

path.dartのContextを使う場合は

(任意の名前).context

と指定すれば フレームワーク標準のContextも path.dartのContextも両方使える状態になります。

関連記事