質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

3回答

11365閲覧

Flutterで"is not a subtype of type 'String'"の対処法

Yariii

総合スコア61

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/10/02 05:55

ラジオボタンを独自のボタンデザインで作りたく、
https://www.366service.com/jp/qa/8588605ff2da41d5287b3fbc2159ac29
を参考に組んでみてるのですが、

type 'RadioModel' is not a subtype of type 'String'

のエラーが吐かれてしまいます。

「RadioItem」と「RadioModel」というクラスを使って、ボタンを作っている感じですが、「RadioModel」のところで Stringタイプじゃないからダメ、と言われているのですかね。
それに対してどういう対処をすれば良いのか想像もつかずでして、、今回知識をお借りいただければと思います。

以下コードです。
ラジオ機能自体はまだ動くか確認できていません(エラーが出て赤画面になってしまうので...)。
なので、今回のエラーの原因と対処法だけ見ていただければと思っています。

flutter

1 2//ラジオボタン のデザイン 3class RadioItem extends StatelessWidget { 4 final RadioModel _item; 5 RadioItem(this._item); 6 @override 7 Widget build(BuildContext context) { 8 return Container( 9 margin: EdgeInsets.all(15.0), 10 child: Row( 11 mainAxisSize: MainAxisSize.max, 12 children: <Widget>[ 13 Container( 14 height: 50.0, 15 width: 50.0, 16 child: Center( 17 child: Text(_item.buttonText, 18 style: TextStyle( 19 color: _item.isSelected ? Colors.white : Colors.black, 20 //fontWeight: FontWeight.bold, 21 fontSize: 18.0)), 22 ), 23 decoration: BoxDecoration( 24 color: _item.isSelected ? Colors.blueAccent : Colors.transparent, 25 border: Border.all( 26 width: 1.0, 27 color: _item.isSelected ? Colors.blueAccent : Colors.grey), 28 borderRadius: const BorderRadius.all(const Radius.circular(2.0)), 29 ), 30 ), 31 ], 32 ), 33 ); 34 } 35} 36 37//エラー的にはここがStringタイプじゃない?と言われているんですかね 38class RadioModel { 39 bool isSelected; 40 final String buttonText; 41 RadioModel(this.isSelected, this.buttonText); 42} 43 44class SearchCast extends StatefulWidget { 45 @override 46 _SearchCastState createState() => _SearchCastState(); 47} 48 49class _SearchCastState extends State<SearchCast> { 50 bool _alreadyDisposed = false; 51 bool isSelected; 52 53 String _sortGradeChecked = ""; 54 final _sortGrade = []; 55 56 @override 57 void initState() { 58 super.initState(); 59 setState(() { 60 _sortGrade.add(RadioModel(false, 'りんご')); 61 _sortGrade.add(RadioModel(false, 'ばなな')); 62 _sortGrade.add(RadioModel(false, 'みかん')); 63 _sortGrade.add(RadioModel(false, 'ぶどう')); 64 _sortGradeChecked = _sortGrade.first; 65 }); 66 } 67 68 @override 69 void setState(Function fn) { 70 if (_alreadyDisposed) return; 71 super.setState(fn); 72 } 73 74 @override 75 void dispose() { 76 _alreadyDisposed = true; 77 super.dispose(); 78 } 79 80 bool _inputGradeMix = false; 81 82 List<Widget> _sortGradeList(StateSetter setState) { 83 List<Widget> sortGradeCheckedList = List(); 84 85 _sortGrade.forEach((_item) { 86 sortGradeCheckedList.add(Container( 87 width: double.infinity, 88 height: 60, 89 decoration: BoxDecoration( 90 border: Border.all(color: Colors.black87, width: 1), 91 borderRadius: BorderRadius.circular(8), 92 ), 93 margin: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 8.0), 94 child: _item.buttonText != 'みかん' 95 ? GestureDetector( 96 behavior: HitTestBehavior.opaque, 97 onTap: () { 98 setState(() { 99 _sortGradeChecked = _item.isSelected; 100 print(_sortGradeChecked); 101 _inputGradeMix = false; 102 }); 103 }, 104 child: Container( 105 color: _item.buttonText == 'みかん' 106 ? Colors.pink 107 : Colors.transparent, 108 child: Text( 109 _item.buttonText, 110 style: TextStyle(), 111 ), 112 )) 113 : Column( 114 children: [ 115 GestureDetector( 116 behavior: HitTestBehavior.opaque, 117 onTap: () { 118 _sortGradeChecked = _item.isSelected; 119 print(_sortGradeChecked); 120 _inputGradeMix = true; 121 }, 122 child: Container( 123 color: _item.buttonText != 'みかん' 124 ? Colors.pink 125 : Colors.transparent, 126 child: Text(_item.buttonText)), 127 ), 128 _inputGradeMix == true 129 ? Container( 130 child: Text('a'), 131 ) 132 : Container() 133 ], 134 ))); 135 }); 136 return sortGradeCheckedList; 137 } 138 139 Widget sortGradeWidget() { 140 return Column( 141 crossAxisAlignment: CrossAxisAlignment.start, 142 children: [ 143 Column( 144 children: _sortGradeList(setState), 145 ), 146 _inputGradeMix == true 147 ? OutlineButton( 148 color: Colors.white, 149 disabledBorderColor: Colors.black, 150 onPressed: () { 151 null; 152 }, 153 child: Text(_currentIndex), 154 ) 155 : Container(), 156 ], 157 ); 158 } 159 160@override 161 Widget build(BuildContext context) { 162 return Material( 163 child: sortGradeWidget(), 164 ); 165} 166} 167

もし不足している情報などがあれば言ってください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

今回のエラーの原因と対処法だけ見ていただければと思っています。

_sortGradeCheckedという値がString型なのに対し、以下のコードで

  • ①の部分で、RadioModel型を代入している
  • ②,③の部分で、bool型を代入している

のが原因だと思います。

とりあえず以下のように、String型に揃えれば、エラーは消えると思います。

diff

1class SearchCast extends StatefulWidget { 2 @override 3 _SearchCastState createState() => _SearchCastState(); 4} 5 6class _SearchCastState extends State<SearchCast> { 7 bool _alreadyDisposed = false; 8 bool isSelected; 9 10 String _sortGradeChecked = ""; 11 final _sortGrade = []; 12 13 @override 14 void initState() { 15 super.initState(); 16 setState(() { 17 _sortGrade.add(RadioModel(false, 'りんご')); 18 _sortGrade.add(RadioModel(false, 'ばなな')); 19 _sortGrade.add(RadioModel(false, 'みかん')); 20 _sortGrade.add(RadioModel(false, 'ぶどう')); 21 // ① 22- _sortGradeChecked = _sortGrade.first; 23+ _sortGradeChecked = _sortGrade.first.buttonText; 24 }); 25 } 26 27 @override 28 void setState(Function fn) { 29 if (_alreadyDisposed) return; 30 super.setState(fn); 31 } 32 33 @override 34 void dispose() { 35 _alreadyDisposed = true; 36 super.dispose(); 37 } 38 39 bool _inputGradeMix = false; 40 41 List<Widget> _sortGradeList(StateSetter setState) { 42 List<Widget> sortGradeCheckedList = List(); 43 44 _sortGrade.forEach((_item) { 45 sortGradeCheckedList.add(Container( 46 width: double.infinity, 47 height: 60, 48 decoration: BoxDecoration( 49 border: Border.all(color: Colors.black87, width: 1), 50 borderRadius: BorderRadius.circular(8), 51 ), 52 margin: const EdgeInsets.symmetric(horizontal: 4.0, vertical: 8.0), 53 child: _item.buttonText != 'みかん' 54 ? GestureDetector( 55 behavior: HitTestBehavior.opaque, 56 onTap: () { 57 setState(() { 58 // ② 59- _sortGradeChecked = _item.isSelected; 60+ _sortGradeChecked = _item.buttonText; 61 print(_sortGradeChecked); 62 _inputGradeMix = false; 63 }); 64 }, 65 child: Container( 66 color: _item.buttonText == 'みかん' 67 ? Colors.pink 68 : Colors.transparent, 69 child: Text( 70 _item.buttonText, 71 style: TextStyle(), 72 ), 73 )) 74 : Column( 75 children: [ 76 GestureDetector( 77 behavior: HitTestBehavior.opaque, 78 onTap: () { 79 // ③ 80- _sortGradeChecked = _item.isSelected; 81+ _sortGradeChecked = _item.buttonText; 82 print(_sortGradeChecked); 83 _inputGradeMix = true; 84 }, 85 child: Container( 86 color: _item.buttonText != 'みかん' 87 ? Colors.pink 88 : Colors.transparent, 89 child: Text(_item.buttonText)), 90 ), 91 _inputGradeMix == true 92 ? Container( 93 child: Text('a'), 94 ) 95 : Container() 96 ], 97 ))); 98 }); 99 return sortGradeCheckedList; 100 } 101 102 Widget sortGradeWidget() { 103 return Column( 104 crossAxisAlignment: CrossAxisAlignment.start, 105 children: [ 106 Column( 107 children: _sortGradeList(setState), 108 ), 109 _inputGradeMix == true 110 ? OutlineButton( 111 color: Colors.white, 112 disabledBorderColor: Colors.black, 113 onPressed: () { 114 null; 115 }, 116 child: Text(_currentIndex), 117 ) 118 : Container(), 119 ], 120 ); 121 } 122 123 @override 124 Widget build(BuildContext context) { 125 return Material( 126 child: sortGradeWidget(), 127 ); 128 } 129} 130

投稿2020/10/02 06:37

nskhei

総合スコア704

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yariii

2020/10/02 07:15

ご回答ありがとうございます。 なるほど、そこで型がくい違うのですね、上手く行きました。勉強になりますm_ _m
guest

0

String型の変数に、RadioModel型を代入しているからだと思います。

String _sortGradeChecked = ""; ~略~ _sortGradeChecked = _sortGrade.first; // RadioModel型

投稿2020/10/02 06:36

satokei

総合スコア1217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yariii

2020/10/02 07:16

上手く行きました。ご回答ありがとうございました。m_ _m
guest

0

以下の_sortGradeCheckedへの代入処理が問題です。

dart

1_sortGradeChecked = _sortGrade.first; 2 3_sortGradeChecked = _item.isSelected;

おそらくやりたいことはこうではないでしょうか?

dart

1_sortGradeChecked = _sortGrade.first.buttonText; 2 3_sortGradeChecked = _item.buttonText;

投稿2020/10/02 06:36

f-miyu

総合スコア1625

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yariii

2020/10/02 07:17

ご回答ありがとうございました。おっしゃる通り、上手く行きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問