Size: a a a

Dart & Flutter по-русски

2020 December 14

АР

Андрей Рудин... in Dart & Flutter по-русски
Prunkles Dreemurr
Но надо, чтобы он также был доступен и для PageB, тот же самый инстанс
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
Provider передает что-то через context
источник

MU

Makhmud Ushamiev in Dart & Flutter по-русски
Prunkles Dreemurr
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() {
 runApp(MyApp());
}

class MyService {
 final int importantValue;
 MyService(this.importantValue);
 String getFoo() {
   return 'foo $importantValue';
 }
}

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return MaterialApp(
     home: PageA(),
   );
 }
}

class PageA extends StatelessWidget {
 final int importantValue = 42;
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     body: Provider(
       create: (context) => MyService(importantValue),
       child: Builder(
         build: (context) => RaisedButton(
           child: Text('To PageB'),
           onPressed: () {
             // Беру сервис с текущей страницы
             final myService = context.read<MyService>();
             Navigator.push(context, MaterialPageRoute(builder: (context) =>
               // Пихаю его в новую страницу
               Provider.value(
                 value: myService,
                 child: PageB(),
               )
             ));
           },
         ),
       ),
     ),
   );
 }
}

class PageA extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     body: Text(context.read<MyService>().getFoo()),
   );
 }
}
Попробуй blocprovider.of<MyService>(context).getfoo()
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
context должен быть ниже, если ты отдаешь в context через Provider что-то, у тебя уже другая условно речка потекла, онга в MyApp разветвляется.
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Makhmud Ushamiev
Попробуй blocprovider.of<MyService>(context).getfoo()
Это абсолютно аналогично тому, что у меня сейчас записано: context.read<MyService>().getFoo() . Это сработало бы, если бы на PageB был бы тот же контекст, что и в месте вызова Navigator.push , но очевидно, что это не так
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
поэтому если есть что-то что тебе нужно и в PageA и в PageB это надо положить наверху.
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
тогда заюзай GetX
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Андрей Рудин
поэтому если есть что-то что тебе нужно и в PageA и в PageB это надо положить наверху.
Но чтобы это "что-то" создать, нужно воспользоваться тем, что доступно только из PageA !
источник

VV

Vitalii Vyrodov in Dart & Flutter по-русски
Может child: PageA() на child: PageB() заменить?
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
а как ты из PageA в PageB попадаешь?
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Vitalii Vyrodov
Может child: PageA() на child: PageB() заменить?
Ой, да, очепятка
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Андрей Рудин
а как ты из PageA в PageB попадаешь?
Нажатием кнопки, через навигатор, в коде написано же
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
когда ты в context положишь в PageA, и перейдешь в PageB, по идее это должно быть в context'е
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Андрей Рудин
когда ты в context положишь в PageA, и перейдешь в PageB, по идее это должно быть в context'е
Нет. Контекст в билдере в MaterialPageRoute привязан к виджету MaterialPage
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Андрей Рудин
когда ты в context положишь в PageA, и перейдешь в PageB, по идее это должно быть в context'е
А, если я правильно понял, то это именно то, что я и сделал на сниппете выше, так?
источник

VV

Vitalii Vyrodov in Dart & Flutter по-русски
А как ты его читаешь в PageB?
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Vitalii Vyrodov
А как ты его читаешь в PageB?
Ну написано же, через context.read<MyService>()
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
Prunkles Dreemurr
А, если я правильно понял, то это именно то, что я и сделал на сниппете выше, так?
по моему у тебя PageB тоже должен быть обернут в провайдер.
источник

PD

Prunkles Dreemurr in Dart & Flutter по-русски
Андрей Рудин
по моему у тебя PageB тоже должен быть обернут в провайдер.
Так он обёрнут, просто ещё в Navigator.push
источник

АР

Андрей Рудин... in Dart & Flutter по-русски
чтобы пользоваться одним провайдером, тебе надо его разместить НАД теми компонентами которые его используют.
источник