前提・実現したいこと
Flutterのstate_notifierの勉強の為、demoを作成してみたのですが、
Android StudioのFlutter Perfomanceを使用して描画回数を確認した所、
私が予想した描画にはなりませんでした。
ボタンを押したり、スイッチを動かした際に該当する部分だけを描画させたいと考えておりましたが
確認した所、フローティングボタンだけは予想通りの描画だったのですが、
それ以外のテキスト入力やスイッチ切り替え処理の際に、タイトルを含む他の部分も再描画していました。
どのような記載にすれば、それぞれ対応した部分だけを描画することができるのでしょうか?
お手数ではございますが御教唆お願いいたします。
該当のソースコード
dart
11.main.dart 2 3import 'package:checkstatenotifer/app_page.dart'; 4import 'package:checkstatenotifer/app_state.dart'; 5import 'package:flutter/material.dart'; 6import 'package:flutter_state_notifier/flutter_state_notifier.dart'; 7import 'package:provider/provider.dart'; 8 9void main() { 10 runApp( 11 MultiProvider( 12 providers: [ 13 StateNotifierProvider<AppController, AppState>( 14 create: (_) => AppController(), 15 ), 16 ], 17 child: MyApp(), 18 ), 19 ); 20} 21 222.app_state.dart 23 24import 'package:flutter/foundation.dart'; 25import 'package:flutter/material.dart'; 26import 'package:freezed_annotation/freezed_annotation.dart'; 27import 'package:state_notifier/state_notifier.dart'; 28 29part 'app_state.freezed.dart'; 30 31 32abstract class AppState with _$AppState { 33 const factory AppState({ 34 (0) int counter, 35 (false) bool color, 36 String text, 37 }) = _AppState; 38} 39 40class AppController extends StateNotifier<AppState> { 41 AppController() : super(const AppState()); 42 43 void switchColor(bool value) { 44 state = state.copyWith(color: value); 45 } 46 47 Color getColor() { 48 return state.color ? Colors.red : Colors.blue; 49 } 50 51 void setText(String value) { 52 state = state.copyWith(text: value); 53 } 54 55 void increment() { 56 state = state.copyWith(counter: state.counter + 1); 57 } 58} 59 603. app_page.dart 61 62import 'package:checkstatenotifer/app_state.dart'; 63import 'package:flutter/material.dart'; 64import 'package:provider/provider.dart'; 65 66class HomePage extends StatelessWidget { 67 const HomePage({Key key}) : super(key: key); 68 69 70 Widget build(BuildContext context) { 71 return Scaffold( 72 appBar: AppBar( 73 title: const Text('State_Notifier Demo'), 74 ), 75 body: Column( 76 mainAxisAlignment: MainAxisAlignment.center, 77 children: [ 78 Center( 79 child: Padding( 80 padding: const EdgeInsets.all(10), 81 child: Column( 82 mainAxisAlignment: MainAxisAlignment.center, 83 children: <Widget>[ 84 TextField( 85 enabled: true, 86 maxLength: 30, 87 onChanged: 88 context.select((AppController value) => value.setText), 89 decoration: InputDecoration( 90 hintText: 'please input your name', 91 labelText: 'name', 92 border: OutlineInputBorder( 93 borderRadius: BorderRadius.circular(15), 94 ), 95 ), 96 ), 97 SwitchListTile( 98 title: const Text('color switch'), 99 value: context.select((AppState value) => value.color), 100 onChanged: context 101 .select((AppController value) => value.switchColor)), 102 Text( 103 context.select((AppState value) => value.text) ?? '', 104 style: TextStyle( 105 color: context 106 .select((AppController value) => value.getColor())), 107 ), 108 DisplayCounter(), 109 ], 110 ), 111 ), 112 ), 113 ], 114 ), 115 floatingActionButton: FloatingActionButton( 116 onPressed: context.select((AppController value) => value.increment), 117 child: const Icon(Icons.add, color: Colors.white), 118 ), 119 ); 120 } 121} 122 123class DisplayCounter extends StatelessWidget { 124 125 Widget build(BuildContext context) { 126 return Text( 127 context.select((AppState value) => value.counter).toString(), 128 style: Theme.of(context).textTheme.headline4, 129 ); 130 } 131} 132 133class MyApp extends StatelessWidget { 134 135 Widget build(BuildContext context) { 136 return MaterialApp( 137 title: 'State_Notifier Demo', 138 theme: ThemeData( 139 primarySwatch: Colors.blue, 140 ), 141 home: const HomePage(), 142 ); 143 } 144} 145 1464. app_state.freezed.dart 147ターミナルでflutter packages pub run build_runner buildを実行すると作成されます 148 1495. pubspe.yaml 150 151name: checkstatenotifer 152description: check_state_notifier 153 154publish_to: 'none' # Remove this line if you wish to publish to pub.dev 155 156version: 1.0.0+1 157 158environment: 159 sdk: ">=2.7.0 <3.0.0" 160 161dependencies: 162 flutter: 163 sdk: flutter 164 freezed_annotation: 165 flutter_state_notifier: ^0.4.2 166 provider: ^4.1.3 167 168dev_dependencies: 169 flutter_test: 170 sdk: flutter 171 build_runner: 172 freezed: 173 pedantic_mono: any 174 175flutter: 176 uses-material-design: true 177
補足情報(FW/ツールのバージョンなど)
Flutter 1.19.0-0.0.pre • channel dev
Dart 2.9.0 (build 2.9.0-5.0.dev 4da5b40fb6)
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/17 10:23