当我在flutter中保持活动小部件时,如何再次请求数据?
我正在用flatter编写一个应用程序,我在页面a中将wantKeepAlive设置为true,然后在initState生命周期中请求数据。现在,我跳转到B页并做一些事情,然后返回到A页,我想再次请求数据,因为我在B页做了一些事情,但A页保持活动状态,它从不运行initState。那么,我应该如何再次请求数据呢?我相信这就是您要寻找的:当我在flutter中保持活动小部件时,如何再次请求数据?,flutter,Flutter,我正在用flatter编写一个应用程序,我在页面a中将wantKeepAlive设置为true,然后在initState生命周期中请求数据。现在,我跳转到B页并做一些事情,然后返回到A页,我想再次请求数据,因为我在B页做了一些事情,但A页保持活动状态,它从不运行initState。那么,我应该如何再次请求数据呢?我相信这就是您要寻找的: class PageA extends StatefulWidget { @override _PageAState createState() =&g
class PageA extends StatefulWidget {
@override
_PageAState createState() => _PageAState();
}
class _PageAState extends State<PageA> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page A'),
),
body: Column(
children: <Widget>[
Text('Page A'),
RaisedButton(
onPressed: goToPageB,
child: Text('Go to Page B'),
)
],
)
);
}
void goToPageB(){
Navigator.of(context).push(MaterialPageRoute(
builder: (context) {
return PageB();
}
)).then((result){
// Once you come back from Page B you can
// fetch your data for page A again here
});
}
}
class PageB extends StatefulWidget {
@override
_PageBState createState() => _PageBState();
}
class _PageBState extends State<PageB> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page B'),
),
body: Column(
children: <Widget>[
Text('Page B'),
RaisedButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Go to Page A'),
)
],
)
);
}
}
class PageA扩展StatefulWidget{
@凌驾
_PageAState createState()=>\u PageAState();
}
类_PageAState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“A页”),
),
正文:专栏(
儿童:[
正文(“A页”),
升起的按钮(
按:戈托帕吉,
子项:文本(“转到B页”),
)
],
)
);
}
void goToPageB(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(上下文){
返回PageB();
}
)).然后((结果){
//一旦你从B页回来,你就可以
//在此处再次获取A页的数据
});
}
}
类PageB扩展了StatefulWidget{
@凌驾
_PageBState createState()=>\u PageBState();
}
类_PageBState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“B页”),
),
正文:专栏(
儿童:[
正文(“B页”),
升起的按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:文本(“转到A页”),
)
],
)
);
}
}
我相信这就是您想要的:
class PageA extends StatefulWidget {
@override
_PageAState createState() => _PageAState();
}
class _PageAState extends State<PageA> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page A'),
),
body: Column(
children: <Widget>[
Text('Page A'),
RaisedButton(
onPressed: goToPageB,
child: Text('Go to Page B'),
)
],
)
);
}
void goToPageB(){
Navigator.of(context).push(MaterialPageRoute(
builder: (context) {
return PageB();
}
)).then((result){
// Once you come back from Page B you can
// fetch your data for page A again here
});
}
}
class PageB extends StatefulWidget {
@override
_PageBState createState() => _PageBState();
}
class _PageBState extends State<PageB> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Page B'),
),
body: Column(
children: <Widget>[
Text('Page B'),
RaisedButton(
onPressed: () => Navigator.of(context).pop(),
child: Text('Go to Page A'),
)
],
)
);
}
}
class PageA扩展StatefulWidget{
@凌驾
_PageAState createState()=>\u PageAState();
}
类_PageAState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“A页”),
),
正文:专栏(
儿童:[
正文(“A页”),
升起的按钮(
按:戈托帕吉,
子项:文本(“转到B页”),
)
],
)
);
}
void goToPageB(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(上下文){
返回PageB();
}
)).然后((结果){
//一旦你从B页回来,你就可以
//在此处再次获取A页的数据
});
}
}
类PageB扩展了StatefulWidget{
@凌驾
_PageBState createState()=>\u PageBState();
}
类_PageBState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“B页”),
),
正文:专栏(
儿童:[
正文(“B页”),
升起的按钮(
onPressed:()=>Navigator.of(context.pop(),
子项:文本(“转到A页”),
)
],
)
);
}
}
我有自己的解决方案
我得到了四个页面,并在另一个状态下用pageview小部件包装它们
当另一个pages值发生变化时,我想用api调用future
在我的例子中,要么我的代码是不调用initState
所以,我使用didUpdateWidget并使wantKeepAlive查找状态小部件
我还使用provider来更改值和注册全局值
我认为您可以使用redux作为寄存器值全局
下面是我的代码。希望对你有帮助
Pageview.dart
Widget _buildPageView($user) {
return PageView(
physics: NeverScrollableScrollPhysics(),
controller: _pageController,
onPageChanged: (index) {
pageChanged(index);
},
children: <Widget>[
HomePage(pageCtrl:_pageController, keepHeight: $user.userKeepHeight), /// this is the page that I call didUpdateWidget when another value is change. And keepHeight is look up provider value. So, it can be changing dynamically.
SearchPage(pageCtrl:_pageController),
ShopPage(),
MyPage(),
],
);
}
Widget\u buildPageView($user){
返回页面视图(
物理学:NeverscrollableScroll物理学(),
控制器:_pageController,
onPageChanged:(索引){
页面更改(索引);
},
儿童:[
主页(pageCtrl:pageController,keepHeight:$user.userKeepHeight),///这是当另一个值更改时我调用didUpdateWidget的页面。keepHeight是查找提供程序值。因此,它可以动态更改。
搜索页面(pageCtrl:_pageController),
ShopPage(),
MyPage(),
],
);
}
首页.dart
class HomePage extends StatefulWidget {
HomePage({Key key, this.pageCtrl, this.keepHeight}) : super(key: key);
final PageController pageCtrl;
bool keepHeight;
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
bool _once = true;
Future _homeFuture;
final dio = Dio();
int _totCnt = 0;
int _listCnt = 0;
final ScrollController _homeScrollCtrl = new ScrollController();
bool keepAlive = true;
var baseUrl = 'https://rest.pickling.kr';
List<HomeDTO> list1;
getHomeContentsList(i,j) async {
Response response;
try {
response = await dio.get("$baseUrl/admin/131/home",
queryParameters: {
'offset':0,
'limit': 30
},
options: Options(headers: {"Authorization": i, "User-Agent": j}));
if (response.statusCode == 200) {
print(response.data['result']);
_totCnt = int.parse(response.data['result']['totCnt']);
_listCnt = int.parse(response.data['result']['listCnt']);
var les1 = response.data['result']['homeList'];
list1 = await les1.map<HomeDTO>((json) => HomeDTO.fromJson(json)).toList();
}
} catch (e) {
print(e);
}
}
@override
void didUpdateWidget(oldWidget) {
super.didUpdateWidget(oldWidget);
UserState $user = Provider.of<UserState>(context, listen: false);
QurateState $qurate = Provider.of<QurateState>(context, listen: false);
if (widget.keepHeight != oldWidget.keepHeight) {
setState(() {
keepAlive = widget.keepHeight;
});
if(widget.keepHeight == false) {
setState(() {
keepAlive = false;
});
updateKeepAlive();
$user.setUserKeepHeight(true);
_homeFuture = _getHomeFuture($user, $qurate);
} else {
setState(() {
keepAlive = true;
});
updateKeepAlive();
}
}
}
@override
void initState() {
super.initState();
UserState $user = Provider.of<UserState>(context, listen: false);
QurateState $qurate = Provider.of<QurateState>(context, listen: false);
_homeFuture = _getHomeFuture($user, $qurate);
}
_getHomeFuture($user, $qurate) async{
await getHomeContentsList($user.accessToken, $user.appInfo);
}
@override
// TODO: implement wantKeepAlive
bool get wantKeepAlive => keepAlive;
@override
Widget build(BuildContext context) {
super.build(context);
return widget code}
类主页扩展StatefulWidget{
主页({Key-Key,this.pageCtrl,this.keepHeight}):超级(Key:Key);
最终页面控制器pageCtrl;
布尔·基菲特;
@凌驾
_HomePageState createState()=>\u HomePageState();
}
类_HomePageState使用AutomaticEpaLiveClientMixin扩展状态{
bool_once=真;
未来(home Future);;
最终dio=dio();
int _totCnt=0;
int _listCnt=0;
最终ScrollController_homeScrollCtrl=新ScrollController();
bool keepAlive=true;
var baseUrl=https://rest.pickling.kr';
清单1;
getHomeContentsList(i,j)异步{
反应;
试一试{
response=wait dio.get($baseUrl/admin/131/home),
查询参数:{
“偏移量”:0,
“限制”:30
},
选项:选项(标题:{“授权”:i,“用户代理”:j});
如果(response.statusCode==200){
打印(响应.数据['result']);
_totCnt=int.parse(response.data['result']['totCnt']);
_listCnt=int.parse(response.data['result']['listCnt']);
var les1=response.data['result']['homeList'];
list1=wait les1.map((json)=>HomeDTO.fromJson(json)).toList();
}
}捕获(e){
印刷品(e);
}
}
@凌驾
void didUpdateWidget(oldWidget){
super.didUpdateWidget(oldWidget);
UserState$user=Provider.of(上下文,侦听:false);
QurateState$qurate=Provider.of(上下文,侦听:false);
if(widget.keepHeight!=oldWidget.keepHeight){
设置状态(){
keepAlive=widget.keepHeight;
});
if(widget.keepHeight==false){
设置状态(){
keepAlive=false;
});
updateKeepAlive();
$user.setUserKeepHeight(true);
_homeFuture=\u getHomeFuture($user,$qur)