Flutter:提供程序不在上一屏幕中更新数据

时间:2020-09-30 21:42:55

标签: android ios flutter flutter-dependencies flutter-provider

在Flutter应用程序中,我正在使用Provider 4.0.4版来管理应用程序的状态。从根本上讲,我的应用程序将列出附近的公司及其评级。用户可以选择一个组织,将其打开并添加他们的评分,这样最终评分将被更新。我正在使用Consumer中的Provider概念来处理任务。

  1. NearByPlacesPage类中,我列出了我周围的公司以及评级信息。用户可以单击公司,然后将他们带到OrganizationPage页。
  2. OrganizationPage类中,再次显示等级。用户可以将他们的评分添加到系统中。然后,OrganizationPage页和NearByPlacesPage(后页)中的评分信息都需要更新。

问题是,当用户更新评分时,OrganizationPage中的评分会更新,而后退堆栈中的NearByPlacesPage不会更新。回到NearByPlacesPage,我们可以清楚地看到旧的评分值。需要重新加载页面以获取更新的值。

下面是我代码中的重要部分

NearByPlacesPage

    class NearByPlacesPage extends StatelessWidget {
      int orgTypeID;
      String orgTypeName;
    
      NearByPlacesPage(this.orgTypeID, this.orgTypeName);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Colors.white,
          body: MultiProvider(
            providers: [
              ChangeNotifierProvider(create: (context) => RatingService()),
            ],
            child: SingleChildScrollView(
              child: _NearByPlacesPageUI(orgTypeID, orgTypeName),
            ),
          ),
          appBar: AppBar(
            title: Text(orgTypeName),
          ),
        );
      }
    }

class _NearByPlacesPageUI extends StatefulWidget {
  int orgTypeID;
  String orgTypename;

  _NearByPlacesPageUI(this.orgTypeID, this.orgTypename);

  @override
  State<StatefulWidget> createState() {
    return _NearByPlacesPageState();
  }
}

class _NearByPlacesPageState extends State<_NearByPlacesPageUI> {
    @override
  Widget build(BuildContext context) {
    Consumer<RatingService>(builder: (context, data, child){
    return Flexible(
        child: ListView.builder(
            itemCount: orgList.length,
            itemBuilder:(BuildContext context, int index) {
                Organization organization = orgList[index];

                if (organization.isDisabled != true) {
                   RatingValue ratingValue = data.getData();

                    return Container(
                        margin: EdgeInsets.only(
                            top: 5, left: 5, right: 5),
                            child: _buildPlace(organization, ratingValue));
                } else {
                    return Container();
                 }
            },),
        );
    },);
  }
}

组织页面

class OrganizationPage extends StatelessWidget {
  Organization organization;
  String orgTypeName;

  OrganizationPage(this.organization, this.orgTypeName);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: _OrganizationPageUI(organization, orgTypeName),
      ),
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text(organization.name),
      ),
    );
  }
}

class _OrganizationPageUI extends StatefulWidget {
  Organization organization;
  String orgTypeName;

  _OrganizationPageUI(this.organization, this.orgTypeName);

  @override
  State<StatefulWidget> createState() {
    return _OrganizationPageState();
  }
}

class _OrganizationPageState extends State<_OrganizationPageUI> {

    @override
  Widget build(BuildContext context) {
    Consumer<RatingService>(
       builder: (context, data, child) {

        Consumer<RatingService>(

            return Row(
                children: <Widget>[
                    Container(
                        margin: EdgeInsets.only(top: 10, left: 10),
                        child: Text(daa.getData()
                        style: Theme.of(context).textTheme.bodyText2.apply(color: Colors.grey),
                        ),
                    ),
                ],
            );
                        
        ),
            
        }
    }
}

OrganizationPage 中,有一个AlerDialog,可让用户进行评分和保存。保存后,它将调用另一个方法来重新加载数据。

Widget _ratingDialog(double _rating) {
    RatingService _ratingService =
        Provider.of<RatingService>(context, listen: false);
    Rating _rating = _ratingService.returnRating();
    double _ratingValue = _ratingService.returnRating().rating;

    return AlertDialog(
      title: const Text("Your Rating"),
      actions: [
        new FlatButton(
          child: const Text("Save"),
          //onPressed: () => Navigator.pop(context),
          onPressed: () async {
            Rating rating = Rating(
                    idrating:
                        _rating.idrating != null ? _rating.idrating : null,
                    user: _user,
                    organization: widget.organization,
                    rating: _ratingValue,
                    dateCreated: DateTime.now().millisecondsSinceEpoch,
                    lastUpdated: DateTime.now().millisecondsSinceEpoch);

                await _ratingService.saveOrUpdateRating(rating, authToken);
                _loadRatingByUserAndOrganization(authToken);
                _loadRatingValueByOrganization(authToken);

                Navigator.pop(context);
          },
        ),
      ],
    );
  }

  Future _loadRatingByUserAndOrganization(String authToken) {
    RatingService _ratingService =Provider.of<RatingService>(context, listen: false);

    return _ratingService.getRatingByUserAndOrganization(
        _authService.getDatabaseUser().user.iduser,
        widget.organization.idorganization,
        authToken);
    
  }

RatingService

这是负责调用notifyListeners()的类。它将由上述AlertDialog触发,并且预期的行为是在OrganizationPageNearByPlacesPage中重新加载数据

class RatingService with ChangeNotifier {

  List<RatingValue> _ratingValueList ;

  List<RatingValue> getData()
  {
    return _ratingValueList;
  }

  //Load rating by user and Organization
  Future<void> getRatingByUserAndOrganization(int idUser, int organizationID, String authToken) async {
 
    try {
      var data = await http.get(
        _navLinks.getRatingByUserAndOrganization(idUser, organizationID),
        headers: {HttpHeaders.authorizationHeader: "Bearer $authToken"},
      );
      print(data.body);
      _rating = Rating.fromJson(convert.json.decode(data.body));
   

      notifyListeners();
    } catch (error) {
      print(error);
      throw error;
    }
  }
}

我做错了什么?

0 个答案:

没有答案