Flutter обновит значение с помощью поставщика на предыдущей странице

#flutter #dart #provider

#трепетать #дротик #поставщик

Вопрос:

У меня есть определитель изменений, который называется MyProvider . На моей View1 странице я вызываю MyProvider для отображения myNumber переменную, которая является числом и которую я инициализирую до 5.

На моей View1 странице у меня есть кнопка, которая толкает меня на View2 страницу, которая также вызывает MyProvider .

На моей View2 странице у меня есть кнопка, которая увеличивает мою myNumber переменную.

Когда я возвращаюсь на свою View1 страницу с навигатором.pop myNumber , переменная не обновляется. Как это сделать ?

Здесь маршрутизатор:

 case RouterName.kView1:  return CupertinoPageRoute(  builder: (context) =gt; ChangeNotifierProviderlt;MyProvidergt;(  create: (BuildContext context) =gt; MyProvider(),  child: Consumerlt;MyProvidergt;(builder :(ctx , provider , child){  return View1();  }),  )  );  case RouterName.kView2:  return CupertinoPageRoute(  builder: (context) =gt; ChangeNotifierProviderlt;MyProvidergt;(  create: (BuildContext context) =gt; MyProvider(),  child: Consumerlt;MyProvidergt;(builder :(ctx , provider , child){  return View2();  }),  )  );  

Мой MyProvider:

 class MyProvider with ChangeNotifier {   // Variables  // ---------------------------------------------------------------------------  late int myNumber;  Future? templateDataToLoad;  late LoadingState templateDataState;   // Constructor  // ---------------------------------------------------------------------------  MyProvider(){  _initialise();  }   // Initialisation  // ---------------------------------------------------------------------------  Future _initialise() async  {  templateDataState = LoadingState.isReady;  templateDataToLoad = await loadingData();   notifyListeners();  }   Future loadingData() async  {  myNumber= 5;  templateDataState = LoadingState.isSuccess;  notifyListeners();  }   // Functions public  // ---------------------------------------------------------------------------  void edit()  {  myNumber = 6;  notifyListeners();  }   }  

In the View1 for show myNumber :

 Consumerlt;MyProvidergt;(  builder: (context, mymodel, child){  return Text(mymodel.myNumber.toString());  } ),  

В View1 кнопке для перехода к просмотру2:

 Navigator.pushNamed(  context,  RouterName.kView2, )  

В View2 я вызываю метод редактирования в моем myProvider . И после того, как я вернусь View1 myNumber , значение » но » всегда будет 5 вместо 6.

Ответ №1:

Потому что в вашем коде ваши View1 » и View2 » MyProvider отличаются:

 case RouterName.kView1:  return CupertinoPageRoute(  builder: (context) =gt; ChangeNotifierProviderlt;MyProvidergt;(  // create a new MyProvider in View1 page  create: (BuildContext context) =gt; MyProvider(),  child: Consumerlt;MyProvidergt;(builder :(ctx , provider , child){  return View1();  }),  )  );  case RouterName.kView2:  return CupertinoPageRoute(  builder: (context) =gt; ChangeNotifierProviderlt;MyProvidergt;(  // create another MyProvider in View2 page  create: (BuildContext context) =gt; MyProvider(),  child: Consumerlt;MyProvidergt;(builder :(ctx , provider , child){  return View2();  }),  )  );  

Вы можете определить свое общее MyProvider следующим образом:

 MyProvider myProvider = MyProvider();  case RouterName.kView1:  return CupertinoPageRoute(  builder: (context) =gt; ChangeNotifierProviderlt;MyProvidergt;.value(  value: myProvider,  child: Consumerlt;MyProvidergt;(builder :(ctx , provider , child){  return View1();  }),  )  );  case RouterName.kView2:  return CupertinoPageRoute(  builder: (context) =gt; ChangeNotifierProviderlt;MyProvidergt;.value(  value: myProvider,  child: Consumerlt;MyProvidergt;(builder :(ctx , provider , child){  return View2();  }),  )  );