実現したいこと
AppBarのタイトルやボタンをString
型やVoidCallback
としてProvider
に保持し、下位のWidgetツリーから変更できるようにしたい。
試したこと
自作のChangeNortifier
を継承したAppBarState
クラスをChangeNotifierProvider
でcreateしてAppBarState
内の値をWidgetで使用しています。
さらに、AppBarState
内でsetTitle
メソッドを定義していて、メソッド実行時、title
の値を変更してnotifyListners()
で通知するようにしています。
ですが、setTitle
メソッド実行時にUIが更新されません。
setTitle
が呼び出されたあと、HotReloadすると値が変更されます。
setTitle
が呼び出された時点で変更を反映させるためにはどうしたらいいのでしょうか。
コードを全て載せると長くなってしまうので、関連する箇所のみコードを載せておきます。
気になるところでもいいので何か分かる方がいましたら、お力添えしていただけるとありがたいです。
よろしくお願いします。
CustomChangeNotifierClass
1class AppBarState extends ChangeNotifier { 2 AppBarState() : hasPreviousPage = false; 3 4 Widget leadButton; 5 VoidCallback leadButtonFunction; 6 bool hasPreviousPage; 7 8 String title = "Title"; 9 10 get leadButtonAction => leadButtonFunction; 11 get appBarTitle => title; 12 13 void setTitle(String value) { 14 title = value; 15 notifyListeners(); 16 } 17 18 void setLeadButton(Widget widget, VoidCallback callback) { 19 leadButton = widget; 20 leadButtonFunction = callback; 21 notifyListeners(); 22 } 23}
CreatingChangeNotifier
1class MyApp extends StatelessWidget { 2 @override 3 Widget build(BuildContext context) { 4 return MultiProvider( 5 providers: [ 6 ChangeNotifierProvider(create: (_) => AppBarState()) 7 ], 8 child: MemberPage(), 9 ); 10 } 11}
UsingValue
1class MemberPage extends StatefulWidget { 2 @override 3 MemberPageState createState() => MemberPageState(); 4} 5 6class MemberPageState extends State<MemberPage> { 7 8 @override 9 Widget build(BuildContext context) { 10 String appBarTitle = Provider.of<AppBarState>(context).appBarTitle; 11 12 return Scaffold( 13 appBar: AppBar( 14 title: Padding( 15 padding: const EdgeInsets.symmetric(horizontal: 20.0), 16 child: Text(appBarTitle), 17 ), 18 ), 19 ... 20 ) 21 } 22}
ChangingValue
1class QuestionDetailList extends StatefulWidget { 2 @override 3 _QuestionDetailListState createState() => _QuestionDetailListState(); 4} 5 6class _QuestionDetailListState extends State<QuestionDetailList> { 7 @override 8 Widget build(BuildContext context) { 9 Provider.of<AppBarState>(context, listen: false).setTitle("Changed Title"); 10 return Container(); 11 } 12}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/27 06:43