Flutter State对象未在changeNotifierProvider中更新

如何解决Flutter State对象未在changeNotifierProvider中更新

我做了一个changenotifierprovider,然后更改了其中的一些数据,当我打印它时,它显示了更新的数据。

但是,当我尝试获取相同的数据对象时,它显示的是存储在其中的先前版本,而不是最新的更新数据。

我还使用了notifyListeners();在其中进行更新,以便可以在所有正在使用数据的地方进行更新,但是不会发生。

data.dart文件:(提供者)

import 'dart:convert';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

import '../Desktop/data_format.dart';
import '../auth/auth-api.dart' as auth;

class DataProvider with ChangeNotifier {
  bool _subscribed = false;

  List<DataTemplate> _data = [];

  List<CategoryTemplate> _categorydata = [];

  List<CategoryTemplate> get categorylist {
    return [..._categorydata];
  }

  List<DataTemplate> get datalist {
    print("New Data: $_data _subscribed = $_subscribed");
    return [..._data];
  }

  bool get subscription {
    return _subscribed;
  }

  Future<void> checkSubscription() async {
    print("Checking Subscription");
    try {
      var _response = await http.get(auth.urlallusers);
      var _extracteddata = jsonDecode(_response.body) as Map<String,dynamic>;
      if (_extracteddata == null) {
        return;
      } else {
        print("You User id is subscribed");
        _subscribed = true;
      }
    } catch (error) {
      print("Not Subscribed");
      throw (error);
    }
    notifyListeners();
  }

  Future<bool> fetchData({bool force = false}) async {
    if (_data.length == 0 || force == true) {
      _data.clear();
      String urldata;
      await checkSubscription();
      _subscribed ? urldata = auth.urldata : urldata = auth.urldemo;
      try {
        _subscribed ? print("Fetching data") : print("Fetching demo");
        var _response = await http.get(urldata);
        var _extracteddata = jsonDecode(_response.body) as Map<String,dynamic>;
        List<DataTemplate> _loadeddata = [];
        int itr = 0;
        List<CategoryTemplate> _categoryloadeddata = [];
        _extracteddata.forEach((category,subcategory) {
          var _newdata = CategoryTemplate(
            id: itr,category: category,subcategory: [],);
          Map<String,dynamic> _subcategorylist = subcategory;
          _subcategorylist.forEach((subcategoryname,names) {
            _newdata.subcategory.add(subcategoryname);
            Map<String,dynamic> name = names;
            name.forEach((nametext,value) {
              _loadeddata.add(
                DataTemplate(
                  id: itr,subcategory: subcategoryname,name: nametext,address: _subscribed ? value['address'] : "demo",email: _subscribed ? value['mail'] : "demo",phonenumber: _subscribed ? value['mob'] : ["demo"].toList(),),);
              itr++;
            });
          });
          _categoryloadeddata.add(_newdata);
        });
        _loadeddata.forEach((element) {
          _data.add(element);
        });
        _categoryloadeddata.forEach((element) {
          _categorydata.add(element);
        });
        notifyListeners();
        print("Data: $_data");
        return false;
      } catch (error) {
        print("Error has occured during fetching data/demo");
        throw (error);
      }
    } else {
      print("All people data has already been fetched");
      return false;
    }
  }

  void addCategory() {
    // _categorylist.add(value);
    notifyListeners();
  }
}

categorypage.dart文件:(正在调用数据的地方)

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../Desktop/data_format.dart';
import '../providers/data.dart';
import '../Desktop/categorytiles.dart';
import 'datatiles.dart';
import '../providers/category.dart';

class CategoryPage extends StatefulWidget {
  @override
  _CategoryPageState createState() => _CategoryPageState();
}

class _CategoryPageState extends State<CategoryPage> {
  bool _pagecategory = true;
  DataProvider _dataProvider;
  List<DataTemplate> _filteredpeople;
  List<CategoryTemplate> _categorylist;
  bool _isLoadingCategory = true;
  bool _isLoadingData = true;
  bool _isInit = true;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print("_isInit = $_isInit");
    print("Is loading Category: $_isLoadingCategory");
    if (_isInit) {
      fetchData();
    }
    _dataProvider = Provider.of<DataProvider>(context);
    setState(() {
      _filteredpeople = _dataProvider.datalist;
      _categorylist = _dataProvider.categorylist;
    });
    print("_filteredpeople = $_filteredpeople");
    _isInit = false;
  }

  void fetchData() {
    Provider.of<CategoryProvider>(context).fetchCategoryData().then((check) => {
          setState(() {
            _isLoadingCategory = check;
          }),print("Is loading Category: $_isLoadingCategory"),});
    Provider.of<DataProvider>(context).fetchData().then((check) => {
          setState(() {
            _isLoadingData = check;
          }),print("Is loading Data: $_isLoadingData"),});
  }

  void _togglePage(bool _switchme) {
    setState(
      () {
        _pagecategory = _switchme;
      },);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xffd4e6f1),floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,floatingActionButton: FloatingActionButton(
        elevation: 3,backgroundColor: Color(0xff1b4f72),child: Icon(
          Icons.arrow_back_ios,color: Colors.white,size: 20,onPressed: () {
          Navigator.pop(context);
        },body: SafeArea(
        child: Container(
          margin: EdgeInsets.only(top: 20),child: Column(
            children: <Widget>[
              //SearchTab
              Card(
                shadowColor: Colors.blue[300],margin: EdgeInsets.symmetric(vertical: 5,horizontal: 30),shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(40)),elevation: 4,child: Container(
                  margin: EdgeInsets.symmetric(horizontal: 25,vertical: 10),padding: EdgeInsets.all(10),child: TextField(
                    cursorColor: Color(0xff5499c7),textAlign: TextAlign.justify,style: TextStyle(
                      color: Color(0xdd1a5276),fontFamily: "roboto",decoration: InputDecoration(
                      focusColor: Colors.black,enabledBorder: UnderlineInputBorder(
                        borderSide: BorderSide(
                          color: Color(0xff5499c7),width: 2,focusedBorder: UnderlineInputBorder(
                        borderSide: BorderSide(
                          color: Color(0xff5499c7),suffixIcon: Container(
                        child: IconButton(
                          icon: Icon(
                            Icons.search,color: Color(0xff5499c7),onPressed: () {},hintText:
                          _pagecategory ? "Search Category" : "Search People",hintStyle: TextStyle(
                        fontFamily: "roboto",color: Color(0x881a5276),onChanged: (text) {
                      setState(() {
                        _pagecategory
                            ? _categorylist = _dataProvider.categorylist
                                .where((u) => u.category
                                    .toLowerCase()
                                    .contains(text.toLowerCase()))
                                .toList()
                            : _filteredpeople = _dataProvider.datalist
                                .where((u) => (u.name
                                        .toLowerCase()
                                        .contains(text.toLowerCase()) ||
                                    u.address
                                        .toLowerCase()
                                        .contains(text.toLowerCase()) ||
                                    u.subcategory
                                        .toLowerCase()
                                        .contains(text.toLowerCase())))
                                .toList();
                      });
                    },Padding(
                padding: const EdgeInsets.all(10.0),child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
                    FlatButton(
                      highlightColor: Colors.transparent,splashColor: Colors.transparent,color: _pagecategory
                          ? Color(0xff5499c7)
                          : Colors.transparent,child: Text(
                        "Category",style: TextStyle(
                          fontFamily: "roboto",color:
                              _pagecategory ? Colors.white : Color(0xff5499c7),onPressed: () {
                        _togglePage(true);
                      },FlatButton(
                      highlightColor: Colors.transparent,color: _pagecategory
                          ? Colors.transparent
                          : Color(0xff5499c7),child: Text(
                        "All People",color:
                              _pagecategory ? Color(0xff5499c7) : Colors.white,onPressed: () {
                        _togglePage(false);
                      },],// data region
              Expanded(
                child: GestureDetector(
                  onHorizontalDragUpdate: (details) {
                    details.delta.dx > 0
                        ?
                        //Right Swipe
                        _togglePage(true)
                        : //Left Swipe
                        _togglePage(false);
                  },child: _pagecategory
                      ? _isLoadingCategory
                          ? Center(
                              child: CircularProgressIndicator(),)
                          : ListView.builder(
                              padding: EdgeInsets.all(10),itemCount: _categorylist.length,itemBuilder: (ctx,index) {
                                var dataitr = _categorylist[index];
                                return Container(
                                  key: ValueKey(dataitr.id),child: CategoryTile(
                                      category: dataitr.category,subcategory: dataitr.subcategory),);
                              },)
                      : _isLoadingData
                          ? Center(
                              child: CircularProgressIndicator(),itemCount: _filteredpeople.length,index) {
                                var dataitr = _filteredpeople[index];
                                return Container(
                                  key: ValueKey(_filteredpeople[index].id),child: DataTile(
                                      name: dataitr.name,category: dataitr.category,subcategory: dataitr.subcategory,address: dataitr.address,email: dataitr.email,phonenumber: dataitr.phonenumber),)
            ],);
  }
}

payment.dart:文件(付款成功后数据会更新)

import 'dart:convert';

import 'package:ShowWorld/models/listed_data.dart';
import 'package:ShowWorld/providers/data.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:http/http.dart' as http;
import 'package:razorpay_flutter/razorpay_flutter.dart';

import '../auth/auth-api.dart' as auth;

class PaymentProvider with ChangeNotifier {
  bool _notsubscribed = true;
  Razorpay _razorpaySubscription = Razorpay();

  @override
  void dispose() {
    super.dispose();
    _razorpaySubscription.clear();
    _razorpayListYourself.clear();
  }

  bool get subscriptionstatus {
    return _notsubscribed;
  }

  void httpsubscribed() async {
    var _extract = await http.get(auth.urlallusers);
    _notsubscribed = jsonDecode(_extract.body) == null;
    notifyListeners();
  }

  void _handlePaymentSuccess(PaymentSuccessResponse response) {
    print("Payment Successful");
    _notsubscribed = false;
    notifyListeners();
    Map<String,String> data = {
      'mob': '${auth.user.phoneNumber}','timestamp': '${DateTime.now().toIso8601String()}',};
    try {
      sendhttpRequest(data);
      Fluttertoast.showToast(
        msg: "Payment Successful",backgroundColor: Colors.green,);
    } catch (e) {
      throw (e);
    }
  }

  void sendhttpRequest(Map<String,String> data) async {
    try {
      await http
          .patch(
        auth.urlallusers,headers: {"Accept": "application/json"},body: jsonEncode(data),)
          .then(
        (value) async {
          print("User Added to Subscription List");
          await DataProvider().fetchData(force: true);
          notifyListeners();
        },);
    } catch (e) {
      throw (e);
    }
  }

  void _handlePaymentError(PaymentFailureResponse response) {
    print("Payment failed");
    Fluttertoast.showToast(
      msg: "Payment Failed",backgroundColor: Colors.red,);
  }

  void _handleExternalWallet(ExternalWalletResponse response) {
    print("Choosing Wallet");
  }

  void makePayment(double price) {
    _razorpaySubscription.on(
        Razorpay.EVENT_PAYMENT_SUCCESS,_handlePaymentSuccess);
    _razorpaySubscription.on(Razorpay.EVENT_PAYMENT_ERROR,_handlePaymentError);
    _razorpaySubscription.on(
        Razorpay.EVENT_EXTERNAL_WALLET,_handleExternalWallet);
    var options = {
      'key': '${auth.razorpaykey}','amount': price * 100,'name': 'Show World Subscription','description': 'Subscription','prefill': {
        'contact': '${auth.user.phoneNumber}',}
    };
    try {
      _razorpaySubscription.open(options);
      notifyListeners();
    } catch (e) {
      throw (e);
    }
  }

调试控制台:

User Added to Subscription List
I/flutter (15578): Checking Subscription
W/libEGL  (15578): EGLNativeWindowType 0x9faf8b08 disconnect failed
D/ViewRootImpl@daf6f43[Toast](15578): dispatchDetachedFromWindow
D/InputTransport(15578): Input channel destroyed: '41874fb',fd=215
I/flutter (15578): You User id is subscribed
I/flutter (15578): Fetching data
D/ViewRootImpl@6e7f972[MainActivity](15578): ViewPostIme key 0
D/ViewRootImpl@6e7f972[MainActivity](15578): ViewPostIme key 1
I/flutter (15578): Data: [Instance of 'DataTemplate',Instance of 'DataTemplate',Instance of 'DataTempl
ate',Instance of 'DataT
emplate',Instance of 'D
ataTemplate',Instance o
f 'DataTemplate',Instan
ce of 'DataTemplate',In
stance of 'DataTemplate',Instan
ce
D/ViewRootImpl@6e7f972[MainActivity](15578): ViewPostIme pointer 0
D/ViewRootImpl@6e7f972[MainActivity](15578): ViewPostIme pointer 1
I/flutter (15578): _isInit = true
I/flutter (15578): Is loading Category: true
I/flutter (15578): Category data has already been fetched
I/flutter (15578): All people data has already been fetched
I/flutter (15578): New Data: [Instance of 'DataTemplate',Instance of 'DataTemplate'] _subscribed = fals
e
I/flutter (15578): _filteredpeople = [Instance of 'DataTemplate',Instance of 'DataTemplate']
I/flutter (15578): Is loading Category: false
I/flutter (15578): Is loading Data: false

正如您在调试控制台中所看到的,“新数据:”的项目数少于数据:(因为未更新)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-