画面遷移で
https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
を参考にして、
1.渡したい変数を保持するclassを作る
2.画面遷移先で、変数を受け取る
3.routetableに画面遷移先を登録する
4.Navigatorをかく。
の手順で、値を渡す画面遷移を実装していたのですが、画面遷移をしようとボタンを押した際に画像のように、
type ScreenArgment is not subtype of type ...
と言うエラーが出てしまいました。
subtypeは調べてみると、派生型と言うものらしいのですが、超初心者のため、いまいちよくつかめません。
このエラーの意味と対処法を教えていただけると幸いです。
import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutterokyaku/confirm.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() => runApp((new MyApp())); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( routes: { ExtractArgumentsScreen.routeName: (context) => ExtractArgumentsScreen(), }, title: 'okyaku', home: MyHomePage( ), ); } } class ScreenArguments { String name; String gender; String age; String memo; ScreenArguments(this.name, this.gender,this.age,this.memo); } class MyHomePage extends StatefulWidget { @override _MyHomePageState createState() => _MyHomePageState(); } enum gender { male, female } enumToString(_gender) { return _gender.toString().split('.')[1]; } class _MyHomePageState extends State<MyHomePage> { String seibetu; final controller = TextEditingController(); final controller2 = TextEditingController(); String dropdownValue = '1'; gender _gender = gender.male; String toshi; @override Widget build(BuildContext context) { print(_gender.toString()); print(dropdownValue); print(controller.text); print(controller2.text); return Scaffold( appBar: AppBar( title: Text('お客様入力情報'), ), body: Column( children: <Widget>[ Row( children: <Widget>[ Text('性別'), Radio( value: gender.male, groupValue: _gender, onChanged: (gender value) { setState(() { _gender = value; }); }, ), Text('男性'), Radio( value: gender.female, groupValue: _gender, onChanged: (gender value) { setState(() { _gender = value; }); }, ), Text('女性'), ], ), Row( children: <Widget>[ Text('名前'), Container( // ** // **** 例: Container 追加 ***** width: 200, child: TextField( decoration: InputDecoration(hintText: 'お名前を記入してください'), controller: controller, ), ) ], ), Row( children: <Widget>[ Text('年齢'), DropdownButton<String>( value: dropdownValue,//ここで何番目のボタンかを選択 icon: Icon(Icons.arrow_downward), iconSize: 24, elevation: 16, style: TextStyle(color: Colors.deepPurple), underline: Container( height: 2, color: Colors.deepPurpleAccent, ), onChanged: (String newValue) { setState(() { dropdownValue = newValue; }); }, items: List<String>.generate(100,(int index)=>(index + 1).toString()) .map<DropdownMenuItem<String>>((String age) { return DropdownMenuItem<String>( value: age, child: Text(age), ); }).toList(), ), ], ), Row( children: <Widget>[ Text('メモ'), Container( // ****** 例: Container 追加 ***** width: 200, child: TextFormField( controller: controller2, decoration: InputDecoration(hintText: 'ご自由にご記入ください'), ), ) ], ), RaisedButton( child: Text("Navigate to screen that extracts arguments"), onPressed: () { // When the user taps the button, navigate to a named route // and provide the arguments as an optional parameter. Navigator.pushNamed( context, ExtractArgumentsScreen.routeName, arguments: ScreenArguments( controller.text, _gender.toString(), dropdownValue, controller2.text, ), ); }, ), ], ), ); } } class ScreenArguments { String name; String gender; String age; String memo; ScreenArguments(this.name, this.gender,this.age,this.memo); } class ExtractArgumentsScreen extends StatelessWidget { static const routeName = '/extractArguments'; @override Widget build(BuildContext context) { // Extract the arguments from the current ModalRoute settings and cast // them as ScreenArguments. final ScreenArguments args = ModalRoute.of(context).settings.arguments;//ここで変数の受け取りをおこな。 return Scaffold( appBar: AppBar( title: Text('確認画面'), ), body: Column( children: <Widget>[ Text('氏名:$args.name'), Text('性別:$args.gender'), Text('年齢:$args.age'), Text('メモ:$args.memo'), ], ), ); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/08 15:57