当我在flutter中保持活动小部件时,如何再次请求数据?

当我在flutter中保持活动小部件时,如何再次请求数据?,flutter,Flutter,我正在用flatter编写一个应用程序,我在页面a中将wantKeepAlive设置为true,然后在initState生命周期中请求数据。现在,我跳转到B页并做一些事情,然后返回到A页,我想再次请求数据,因为我在B页做了一些事情,但A页保持活动状态,它从不运行initState。那么,我应该如何再次请求数据呢?我相信这就是您要寻找的: class PageA extends StatefulWidget { @override _PageAState createState() =&g

我正在用flatter编写一个应用程序,我在页面a中将wantKeepAlive设置为true,然后在initState生命周期中请求数据。现在,我跳转到B页并做一些事情,然后返回到A页,我想再次请求数据,因为我在B页做了一些事情,但A页保持活动状态,它从不运行initState。那么,我应该如何再次请求数据呢?

我相信这就是您要寻找的:

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)