2017-08-29 19 views
2

PageControllerによって管理されるPageView内に一連のステートフルウィジェットがあります。私はpageController.jumpToPage(index)を使ってページを切り替えています。ページを切り替えると、まるで最初から再作成されたかのように、すべての状態がウィジェット内で失われているように見えます。私はPageControllerでkeepPage: trueを使用しようとしましたが、それは効果がないようです。これはPageViewの意図した動作ですか、何か間違っていますか?任意の提案をいただきありがとうございます!Flutterでページを切り替えるとウィジェットの状態が失われるPageView

答えて

2

keepPage: trueです。 PageControllerが破壊されて再作成された場合、そのページが覚えていることを意味します。これはあなたが望むものではありません。

代わりに、ページ固有のPageStorageKeyをページのコンストラクタに渡します。これはFlutterがあなたのページにユニークなストレージバケツを与えるのに役立ちます。次に、Stateに以前の状態に復元する場合はPageStorage.of(context)を使用してストレージバケットを取得できます。readの値はinitStateで、writeの値は変更された時点の値になります。例はExpansionTileにあります。

+0

これはこれが必要であることは奇妙に思えます。だから私は、ページビュー、またはナビゲーションスタックのすべてのウィジェットのスクロール位置を保存する必要があります場合は、そのようなものが存在する?ページを閉じるときにウィジェットをそのまま残す方法はありますか? PageViewのウィジェットの1つが、ページを外すときに状態を失うことはありません。そのため、私は全体的に何かばかげたことをしていることになります。 –

+0

スクロール位置はフレームワークによって内部的に保持されます。[ScrollPosition'クラス]の 'PageStorage'の使用方法を参照してください(https://github.com/flutter/flutter/blob/6655074b370d39150d2ed28f67851e3bce7013ab/packages/flutter/lib/src/ウィジェット/ scroll_position.dart#L303)。他の状態が維持されている場合は、それがツリーの上位レベルに格納されている可能性があります。 –

+0

ありがとうございました、ListViewを含むウィジェットのPageStorageキーを設定すると、スクロール位置を保存するというトリックが完了したようです。残りの状態ハンドリングがとても驚くほど自動化されている場合、なぜ手動で状態の部分を保存するのが必要なのか、私にはまだ分かりにくいのです。 StatefulWidgetが作成する状態オブジェクトが保存されてから自動的に再利用されるのはなぜか分かりません。 –

関連する問題