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

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

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

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

Dart

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

Q&A

解決済

2回答

1014閲覧

トグルボタンを押下した際に別のウィジェットも変更したい

zisinnasi

総合スコア3

Flutter

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

Dart

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

0グッド

0クリップ

投稿2022/08/07 11:05

前提・実現したいこと

トグルボタンを押下した際に別のウィジェットも変更したい
(今回でいうとテキスト)

発生している問題

トグルボタンの関数の中で変数を変更してテキストを変更しようとしたができない

該当のソースコード

flutter

1import 'package:flutter/material.dart'; 2 3int br = 0; 4 5void main() { 6 runApp(MyApp()); 7} 8 9class MyApp extends StatelessWidget { 10 11 @override 12 Widget build(BuildContext context) { 13 return MaterialApp( 14 home: Scaffold( 15 body: Column( 16 children: [ 17 _ToggledButton(), 18 _Text(), 19 ], 20 ), 21 ), 22 ); 23 } 24} 25 26class _ToggledButton extends StatefulWidget { 27 const _ToggledButton({Key? key}) : super(key: key); 28 29 @override 30 State<_ToggledButton> createState() => _ToggledButtonState(); 31} 32 33class _ToggledButtonState extends State<_ToggledButton> { 34 List<bool> selected = [true,false]; 35 36 @override 37 Widget build(BuildContext context) { 38 return Container( 39 child: ToggleButtons( 40 selectedColor: Colors.red, 41 children: [ 42 Text('赤'), 43 Text('青'), 44 ], 45 isSelected:selected, 46 onPressed: (index){ 47 setState(() { 48 if (index==0){ 49 selected[0] = true; 50 selected[1] = false; 51 br=1; 52 }else{ 53 selected[0] = false; 54 selected[1] = true; 55 br=0; 56 } 57 58 }); 59 }, 60 ), 61 ); 62 } 63} 64 65class _Text extends StatefulWidget { 66 const _Text({Key? key}) : super(key: key); 67 68 @override 69 State<_Text> createState() => _TextState(); 70} 71 72class _TextState extends State<_Text> { 73 @override 74 Widget build(BuildContext context) { 75 return Container( 76 child: SelectCol(), 77 ); 78 } 79 80 Widget SelectCol(){ 81 if (br==0){ 82 return Text('青'); 83 }else{ 84 return Text('赤'); 85 } 86 } 87 88} 89

試したこと

MaterialAppのhomeにprovider?というものを使ってトライしてみましたが自分では解決できませんでした
ご教授いただきますとありがたいです

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

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

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

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

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

guest

回答2

0

ベストアンサー

Provider+ChangeNotifier版です。

import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ToggleStateNotifier extends ChangeNotifier { List<bool> selected = [true, false]; void setToggleState(int index) { if (index == 0) { selected[0] = true; selected[1] = false; } else { selected[0] = false; selected[1] = true; } notifyListeners(); } String get selectedColorString { return selected[0] ? '赤赤' : '青青'; } } void main() { runApp( ChangeNotifierProvider<ToggleStateNotifier>( create: (_) => ToggleStateNotifier(), child: MyApp(), ), ); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { ToggleStateNotifier toggleStateNotifier = Provider.of<ToggleStateNotifier>(context,); List<bool> selected = toggleStateNotifier.selected; return MaterialApp( home: Scaffold( body: Column( children: [ Text('$selected'), _ToggledButton(), _Text(), ], ), ), ); } } class _ToggledButton extends StatelessWidget { _ToggledButton({Key? key,}) : super(key: key); @override Widget build(BuildContext context) { ToggleStateNotifier toggleStateNotifier = Provider.of<ToggleStateNotifier>(context,); return Container( child: ToggleButtons( selectedColor: Colors.red, children: [ Text('赤赤'), Text('青青'), ], isSelected: toggleStateNotifier.selected, onPressed: (index) { toggleStateNotifier.setToggleState(index); }, ), ); } } class _Text extends StatelessWidget { const _Text({Key? key,}) : super(key: key); @override Widget build(BuildContext context) { ToggleStateNotifier toggleStateNotifier = Provider.of<ToggleStateNotifier>(context,); String selectedColorString = toggleStateNotifier.selectedColorString; return Container( child: Text(selectedColorString), ); } }

投稿2022/08/07 18:07

moriman

総合スコア615

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

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

zisinnasi

2022/08/08 01:34

回答ありがとうございます 今の自分では理解できない部分が多々あるので勉強させていただきます
guest

0

期待する具体的な挙動がはっきりわからないですが、多分これでしょうか。
グローバル変数で複数ウィジェットの状態を管理しようとするのはやめた方が良いと思います。
コードが読みにくくなりますし、エラーが発生しやすくなると思います。
https://docs.flutter.dev/development/data-and-backend/state-mgmt/intro
ここら辺を一通り読めばStatefulWidget/setStateを使った状態管理はできるようになると思います。
この場合_ToggledButtonの状態を_Textでも共有したい(_Textにも反映させたい)ので、両者に共通の親(MyApp)に状態を保持させるのがセオリーかと思います。
と言ってもこれくらいのアプリでもコードが複雑になるので、(学習目的以外では)やはり状態管理用パッケージを使うのが一般的かと思います。

import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { List<bool> selected = [true,false]; void setNewValueOfParentSelected(List<bool> selected){ setState((){ this.selected = selected; }); } @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Column( children: [ Text('$selected'), _ToggledButton( selected:selected, setStateCallback: setNewValueOfParentSelected, ), _Text(selectedColorString: selected[0] ? '赤' : '青',), ], ), ), ); } } class _ToggledButton extends StatefulWidget { _ToggledButton({ Key? key, required this.selected, required this.setStateCallback, }) : super(key: key); List<bool> selected; void Function(List<bool>) setStateCallback; @override State<_ToggledButton> createState() => _ToggledButtonState(); } class _ToggledButtonState extends State<_ToggledButton> { late List<bool> selected; @override void initState(){ super.initState(); selected = widget.selected; } @override Widget build(BuildContext context) { return Container( child: ToggleButtons( selectedColor: Colors.red, children: [ Text('赤'), Text('青'), ], isSelected:selected, onPressed: (index){ setState(() { if (index==0){ selected[0] = true; selected[1] = false; }else{ selected[0] = false; selected[1] = true; } widget.setStateCallback(selected); }); }, ), ); } } class _Text extends StatelessWidget { const _Text({ Key? key, required this.selectedColorString, }) : super(key: key); final String selectedColorString; @override Widget build(BuildContext context) { return Container( child: Text(selectedColorString), ); } }

投稿2022/08/07 17:00

moriman

総合スコア615

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問