我在由PageController管理的PageView中有一系列有状态的小部件.我pageController.jumpToPage(index)
用来切换页面.切换页面时,窗口小部件中的所有状态似乎都会丢失,就像从头开始重新创建一样.我已尝试keepPage: true
在PageController中使用,但似乎没有任何效果.这是PageView的预期行为还是我做错了什么?任何建议表示赞赏,谢谢!
小智 39
与AutomaticKeepAliveClientMixin一起使用到您的SubPage.
那么@override bool得到wantKeepAlive => true; 这是一个样本
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 4,
child: new Scaffold(
appBar: new AppBar(
bottom: new TabBar(
tabs: [
new Tab(icon: new Icon(Icons.directions_car)),
new Tab(icon: new Icon(Icons.directions_transit)),
new Tab(icon: new Icon(Icons.directions_bike)),
new Tab(
icon: new Icon(Icons.airplanemode_active),
)
],
),
),
body: new TabBarView(children: [
new OnePage(color: Colors.black,),
new OnePage(color: Colors.green,),
new OnePage(color: Colors.red,),
new OnePage(color: Colors.blue,),
]),
),
);
}
}
class OnePage extends StatefulWidget {
final Color color;
const OnePage({Key key, this.color}) : super(key: key);
@override
_OnePageState createState() => new _OnePageState();
}
class _OnePageState extends State<OnePage> with AutomaticKeepAliveClientMixin<OnePage> {
@override
Widget build(BuildContext context) {
super.build(context);
return new SizedBox.expand(
child: new ListView.builder(
itemCount: 100,
itemBuilder: (context, index) {
return new Padding(
padding: const EdgeInsets.all(10.0),
child: new Text(
'$index',
style: new TextStyle(color: widget.color),
),
);
},
),
);
}
@override
bool get wantKeepAlive => true;
}
Run Code Online (Sandbox Code Playgroud)
O T*_*Ldt 21
编写自定义小部件:
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;
}
Run Code Online (Sandbox Code Playgroud)
并在综合浏览量中使用:
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()),
],
);
}
}
Run Code Online (Sandbox Code Playgroud)
Col*_*son 10
keepPage: true
是默认行为;这意味着PageController
如果销毁并重新创建页面,它将记住该页面所在的页面。这不是你想要的。
而是将特定PageStorageKey
于页面的内容传递给页面的构造函数。这有助于Flutter为您的页面提供一个独特的存储桶。然后,在您State
要恢复到先前状态的状态中,可以使用PageStorage.of(context)
获取存储分区,您可以read
在更改存储范围时从in initState
和write
value中获取值。您可以在ExpansionTile中看到一个示例。
归档时间: |
|
查看次数: |
8657 次 |
最近记录: |