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

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

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

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

Dart

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

Q&A

解決済

1回答

391閲覧

テキストフォームをクリックしてドラムで入力させたい

zisinnasi

総合スコア3

Flutter

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

Dart

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

0グッド

0クリップ

投稿2022/09/02 06:03

前提

flutter初心者です

ドラムで値を選択できるようにしたい
参考にさせていただいたHPをそのまま実行して試していますがエラーがでており何がエラーかわからない

実現したいこと

テキストフォームからドラムで値を選択させたい

発生している問題・エラーメッセージ

エラーメッセージ Undefined name 'context'.

該当のソースコード

dart

1import 'package:flutter/material.dart'; 2import 'package:flutter/cupertino.dart'; 3 4void main() => runApp(MyApp()); 5 6class MyApp extends StatelessWidget { 7 8 Widget build(BuildContext context) { 9 return MaterialApp( 10 title: 'Modal Picker', 11 theme: ThemeData( 12 primarySwatch: Colors.blue, 13 ), 14 home: const MyHomePage(title: 'Modal Picker'), 15 ); 16 } 17} 18 19class MyHomePage extends StatefulWidget { 20 const MyHomePage({Key? key, required this.title}) : super(key: key); 21 22 final String title; 23 24 25 _MyHomePageState createState() => _MyHomePageState(); 26} 27 28class _MyHomePageState extends State<MyHomePage> { 29 30 Widget build(BuildContext context) { 31 return Scaffold( 32 appBar: AppBar( 33 title: Text(widget.title), 34 ), 35 body: Center( 36 child: Column( 37 mainAxisAlignment: MainAxisAlignment.center, 38 children: [ 39 buildTextFormField(context), 40 ], 41 ), 42 ), 43 ); 44 } 45} 46 47TextFormField buildTextFormField(BuildContext context) { 48 return TextFormField( 49 onTap: () { 50 // キーボードが出ないようにする 51 FocusScope.of(context).requestFocus(new FocusNode()); 52 showPicker(); 53 }, 54 decoration: const InputDecoration(hintText: 'テキストを入力'), 55 ); 56} 57 58void showPicker() { 59 final list = ['選択肢1', '選択肢2', '選択肢3']; 60 final _pickerItems = list.map((item) => Text(item)).toList(); 61 var selectedIndex = 0; 62 63 showCupertinoModalPopup<void>( 64 context: context, 65 builder: (BuildContext context) { 66 return Container( 67 height: 216, 68 child: GestureDetector( 69 onTap: () { 70 Navigator.pop(context); 71 }, 72 child: CupertinoPicker( 73 itemExtent: 32, 74 children: _pickerItems, 75 onSelectedItemChanged: (int index) { 76 selectedIndex = index; 77 }, 78 ), 79 ), 80 ); 81 }, 82 ); 83}

試したこと

import 'dart:js';のimport
var contextを定義

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接のエラーの原因はエラーメッセージ通り、showPicker内で使用しているcontext未定義だからです。
void showPicker() {void showPicker(BuildContext context) {に変更し、呼び出し箇所をshowPicker(context);とすることで構文エラーは取り除け、実行可能にはなります。

ただこれだけではたぶん希望する動作、ドラム選択した文字列をTextFormFieldに表示させることはできません。まあそのような実装になっていないからです。

足りないのは以下項目。

  • TextFormFieldに対して後で値を変更する仕組みになっていない。
  • ドラム選択した結果をTextFormFieldに反映させようとしていない。

で、上記合わせた修正結果は以下の通り。

dart

1import 'package:flutter/material.dart'; 2import 'package:flutter/cupertino.dart'; 3 4void main() => runApp(MyApp()); 5 6class MyApp extends StatelessWidget { 7 8 Widget build(BuildContext context) { 9 return MaterialApp( 10 title: 'Modal Picker', 11 theme: ThemeData( 12 primarySwatch: Colors.blue, 13 ), 14 home: const MyHomePage(title: 'Modal Picker'), 15 ); 16 } 17} 18 19class MyHomePage extends StatefulWidget { 20 const MyHomePage({Key? key, required this.title}) : super(key: key); 21 22 final String title; 23 24 25 _MyHomePageState createState() => _MyHomePageState(); 26} 27 28class _MyHomePageState extends State<MyHomePage> { 29 late TextEditingController _controller; 30 31 32 void initState() { 33 super.initState(); 34 _controller = TextEditingController(); 35 } 36 37 38 void dispose() { 39 _controller.dispose(); 40 super.dispose(); 41 } 42 43 TextFormField buildTextFormField(BuildContext context) { 44 return TextFormField( 45 onTap: () { 46 // キーボードが出ないようにする 47 FocusScope.of(context).requestFocus(new FocusNode()); 48 showPicker(context); 49 }, 50 decoration: const InputDecoration(hintText: 'テキストを入力'), 51 controller: _controller, 52 ); 53 } 54 55 void showPicker(BuildContext context) { 56 final list = ['選択肢1', '選択肢2', '選択肢3']; 57 final _pickerItems = list.map((item) => Text(item)).toList(); 58 59 showCupertinoModalPopup<void>( 60 context: context, 61 builder: (BuildContext context) { 62 return Container( 63 height: 216, 64 child: GestureDetector( 65 onTap: () { 66 Navigator.pop(context); 67 }, 68 child: CupertinoPicker( 69 itemExtent: 32, 70 children: _pickerItems, 71 onSelectedItemChanged: (int index) { 72 setState(() { 73 _controller.text = list[index]; 74 }); 75 }, 76 ), 77 ), 78 ); 79 }, 80 ); 81 } 82 83 84 Widget build(BuildContext context) { 85 return Scaffold( 86 appBar: AppBar( 87 title: Text(widget.title), 88 ), 89 body: Center( 90 child: Column( 91 mainAxisAlignment: MainAxisAlignment.center, 92 children: [ 93 buildTextFormField(context), 94 ], 95 ), 96 ), 97 ); 98 } 99}

投稿2022/09/02 21:00

ta.fu

総合スコア1667

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

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

zisinnasi

2022/09/04 02:59

ありがとうございます! setStateで反映しないといけないということですね あとcontoroller.textで表示側に反映できるのも勉強になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問