首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从其他StatefulWidget更新StatefulWidget?

如何从其他StatefulWidget更新StatefulWidget?
EN

Stack Overflow用户
提问于 2018-09-07 18:02:45
回答 3查看 3.3K关注 0票数 1

我的屏幕上有3个标签。所有人都有不同的观点。当用户来到屏幕时,我必须点击API并更新所有3个选项卡的视图。我无法更新视图中的选项卡。获取API响应后,无法更新不同页签的状态。

错误

代码语言:javascript
复制
Error-> NoSuchMethodError: The method 'updateInfo' was called on null.
I/flutter ( 7515): Receiver: null
I/flutter ( 7515): Tried calling: updateInfo(Instance of 'OwnerInfo')

屏幕视图如下:

DetailItem

代码语言:javascript
复制
class DetailItem extends StatefulWidget {
  PropertyItem _propertyObj;
  OwnerInfo _ownerInfo;
  Review _reviewInfo;

  @override
  _DetailItemState createState() => _DetailItemState();
}

class _DetailItemState extends State with TickerProviderStateMixin {
  ScrollController _scrollController = new ScrollController();
  double _appBarHeight = 0.0;
  TabController _tabController;

  final GlobalKey key =
      new GlobalKey();

  //Tabs used in Detail Screen
  DetailViewTab _detailViewTab;
  AddressViewTab _addressViewTab;
  ReviewTab _reviewTab;

  @override
  void initState() {
    _tabController = TabController(length: 3, vsync: this, initialIndex: 0); // initialize tab controller
    //Initialize Tabs
    _detailViewTab = DetailViewTab(widget._propertyObj);
    _addressViewTab = AddressViewTab(key: key, propertyDetailModel: widget._ownerInfo);
    _reviewTab = ReviewTab(widget._propertyObj);

    _hitDetailAPI(); //init state Hit API
    super.initState();
  }

  //Detail API
  void _hitDetailAPI() async {
    Future obj = APIHandler()
        .getPropertyDetail(widget._propertyObj.getRoomId.toString());
    obj.then((response) {
      if (!mounted) {
        return;
      }
      //update data in set state
      setState(() {
        if (response != null && response.getPropertyItem != null) {
          widget._propertyObj = response.getPropertyItem; // update data to property object the 1st tab(Detail)
          widget._ownerInfo = response.getOwnerInfo; // update data to owner info object the second tab (Address)
          key.currentState.updateInfo(widget._ownerInfo); // Tried to update the address tab view by calling through key current state.
        }
      });
    }).catchError((error) {
      print("Error-> " + error.toString());
    });
  }

AddressViewTab

代码语言:javascript
复制
class AddressViewTab extends StatefulWidget {
  OwnerInfo ownerInfo = OwnerInfo();
  AddressViewTab({ Key key , @required this.ownerInfo}) : super(key: key);

  @override
  AddressViewTabState createState() => AddressViewTabState();

}

class AddressViewTabState extends State{

  updateInfo(OwnerInfo ownerInfo){
    print("Update method called");
    if (!mounted) {
      return;
    }
    setState(() {
      widget.ownerInfo=ownerInfo; // update state 
    });
  }

  @override
  Widget build(BuildContext context) {
      return Container(
          alignment: Alignment.center,
          child: ListView(
            children: [
              getOwnerInfoCard(widget.ownerInfo),
            ],
          ),
        );
  }

}

任何帮助都将不胜感激。提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-09-07 18:08:45

您可以使用Redux的flutter实现来实现以下内容https://pub.dartlang.org/packages/flutter_redux

简而言之,这可以使 "任何 "小组件在某些数据发生变化时自我更新。

票数 0
EN

Stack Overflow用户

发布于 2020-09-10 22:58:24

我已经在这里回答了这个问题https://stackoverflow.com/a/63832366/13439617

您可以使用回调来完成此工作

票数 0
EN

Stack Overflow用户

发布于 2021-03-01 01:05:45

来自推送stateFul widget:

代码语言:javascript
复制
GestureDetector(
            onTap: () async {
             dynamic result = await Navigator.of(context).push(MaterialPageRoute(
                  builder: (context) => CreateUser(
                    usersObj: usersObj,
                  )));
             if (result != null) {
               setState(() {
                 usersObj = result;
               });
             }
            },

来自pop stateFul小部件:

代码语言:javascript
复制
Navigator.pop(context,usersObj);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52220156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档