我在PageController管理的PageView中有一系列有状态的小部件。我正在使用pageController.jumpToPage(index)
来切换页面。切换页面时,窗口小部件中的所有状态似乎都会丢失,就像从头开始重新创建一样。我尝试在PageController中使用keepPage: true
,但似乎没有任何效果。这是PageView的预期行为还是我做错了什么?任何建议表示赞赏,谢谢!
答案 0 :(得分:18)
与AutomaticKeepAliveClientMixin一起使用到您的SubPage。
然后@override bool get wantKeepAlive =>真正; 这是一个样本
[NSString initWithBytes:length:encoding:]
答案 1 :(得分:7)
编写自定义窗口小部件:
import 'package:flutter/material.dart';
class KeepAlivePage extends StatefulWidget {
KeepAlivePage({
Key key,
@required this.child,
}) : super(key: key);
final Widget child;
@override
_KeepAlivePageState createState() => _KeepAlivePageState();
}
class _KeepAlivePageState extends State<KeepAlivePage>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
/// Dont't forget this
super.build(context);
return widget.child;
}
@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => true;
}
并在网页浏览中使用:
import 'package:flutter/material.dart';
import 'keep_alive_page.dart';
class PageViewDemo extends StatefulWidget {
const PageViewDemo({Key key}) : super(key: key);
@override
_PageViewDemoState createState() => _PageViewDemoState();
}
class _PageViewDemoState extends State<PageViewDemo> {
@override
Widget build(BuildContext context) {
return PageView(
children: [
KeepAlivePage(child:Page1()),
KeepAlivePage(child: Page2()),
KeepAlivePage(child:Page3()),
],
);
}
}
答案 2 :(得分:4)
keepPage: true
是默认行为;这意味着PageController
将记住它被破坏和重新创建时的页面。这不是你想要的。
相反,将特定于页面的PageStorageKey
传递给页面的构造函数。这有助于Flutter为您的页面提供独特的存储桶。然后,在您希望恢复到之前状态的State
中,您可以使用PageStorage.of(context)
获取存储桶,您可以read
中的initState
值来存储write
值变为值。您可以在ExpansionTile中看到一个示例。