#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(); }), ) );