AnimatedTextKitパッケージでTextの文字列が変わらない場合に対処法
AnimatedTextKitのテキストを更新する方法
はじめに
以下の記事のとおり、クイズアプリをFlutterで作るのにあたり、AnimatedTextKitを使ってタイプライターのようにテキストを1文字ずつ徐々に表示する対応をしました。
AnimatedTextKitパッケージ:
https://pub.dev/packages/animated_text_kit/
しかし、1度目のアニメーションはいいのですが、2度目以降、同じAnimatedTextKitを使ってテキストだけ変更して画面のリビルドがされても、アニメーションが発動せず、テキストも変わりません。
問題点
以下のとおり、次の問題に進んでも、問題文が更新されずに、そのまま残ってしまいます。
問題文のテキストは更新され、描画リビルド時にはきちんと渡ってきていることは確認できています。
この際のソースコードは以下のとおりです。
return Container(
alignment: Alignment.centerLeft,
child: AnimatedTextKit(
animatedTexts: [
TypewriterAnimatedText(
questionText,
textStyle: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16),
speed: const Duration(milliseconds: 100),
cursor: '',
),
],
totalRepeatCount: 1,
),
),
このquestionTextが更新されても、AnimatedTextKitの描画は更新されません。
リピート回数を1にしているせいかと思い、totalRepeatCountを変えてみましたが解決しません。
questionTextが変化しても、どうやらAnimatedTextKitはそれを検知して再構築してはくれないようです。
対処方法
AnimatedTextKitはStatefulWidgetを継承しているのですが、どうやらanimatedTextsの中のAnimatedTextのテキストが変わったとしても、AnimatedTextKitのsetStateは反応せず、更新はされないようです。
したがって、AnimatedTextKitを強制的に更新させる必要があります。
そのため、AnimatedTextKitのKeyを利用します。
return Container(
alignment: Alignment.centerLeft,
child: AnimatedTextKit(
key: ValueKey<String>(questionText), //<--追加
animatedTexts: [
TypewriterAnimatedText(
questionText,
textStyle: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 16),
speed: const Duration(milliseconds: 100),
cursor: '',
),
],
totalRepeatCount: 1,
),
),
上記のコードのとおり、AnimatedTextKitのkeyプロパティにValueKey<String>(questionText)として、テキストをKeyにさせて、AnimatedTextKitを再構築させます。
これにより、次の問題に進んだ際に、テキストが更新されてアニメーションされることが確認できました。
ちなみにiOSとAndroidそれぞれネイティブで同じ対応したときの記事は以下にあります。