Size: a a a

Flutter Developers — русскоговорящее сообщество

2020 January 13

KS

Konstantin Smirnov in Flutter Developers — русскоговорящее сообщество
Либо можно поставить вопрос по-другому:  Можэно ли передать данные из одного виджета в другой, если он существует.
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Konstantin Smirnov
Либо можно поставить вопрос по-другому:  Можэно ли передать данные из одного виджета в другой, если он существует.
Можно вообще по всему приложению передать, при условии, что место куда передаешь - является одним из потомков места откуда передаешь)
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
В этом и есть вся суть контекста)
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
provider в помощь
источник

KS

Konstantin Smirnov in Flutter Developers — русскоговорящее сообщество
А в провайдере можно задать что-то типа эвента, чтобы он в потомке срабатывал, когда в родителе появятся новые данные?
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Konstantin Smirnov
А в провайдере можно задать что-то типа эвента, чтобы он в потомке срабатывал, когда в родителе появятся новые данные?
Да, там есть всякое такое, включая стримы.
источник

KS

Konstantin Smirnov in Flutter Developers — русскоговорящее сообщество
Буду рыть в сторону провайдера, спасибо!
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Konstantin Smirnov
Буду рыть в сторону провайдера, спасибо!
По идее проблем быть не должно
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Konstantin Smirnov
Буду рыть в сторону провайдера, спасибо!
import 'dart:async';
import 'dart:math' show Random;

typedef Future Handler();

void main() async {
 // Объявляю контроллер для проброса результатов
 final StreamController<dynamic> _resultController = StreamController<dynamic>.broadcast();
 final Stream<dynamic> _handlerResultStream = _resultController.stream;
 
 // Виджеты "слущающие" контроллер результатов
 widget1(_handlerResultStream);
 widget2(_handlerResultStream);
 
 // Моя функция - хэндлер
 Handler handler = () =>
   Future.delayed(const Duration(seconds: 1))
   .then((_) => Random().nextInt(1024));
 
 
 // Гдето получаю результат хэндлера и добавляю в контроллер
 handler().then(_resultController.add);
 
 
 // dispose (При закрытии)
 await Future.delayed(const Duration(seconds: 5));
 _resultController.close();
}


void widget1(Stream<dynamic> _handlerResultStream) {
 _handlerResultStream.forEach((dynamic result) => print('Widget #1: $result'));
}

void widget2(Stream<dynamic> _handlerResultStream) {
 _handlerResultStream.forEach((dynamic result) => print('Widget #2: $result'));
}
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Вот я бы так, наверное, сделал)
источник

🅵

🅵🅾️🆇 in Flutter Developers — русскоговорящее сообщество
Вместо forEach в "виджетах" у тебя был бы StreamBuilder
источник

KS

Konstantin Smirnov in Flutter Developers — русскоговорящее сообщество
Спасибо всем огромное. Сделал на основе этого: https://dev.to/shakib609/create-a-todos-app-with-flutter-and-provider-jdh
Как раз мой случай
источник
2020 January 14

AP

Alexey Perelygin in Flutter Developers — русскоговорящее сообщество
Привет всем! Нужна ваша помощь:) Буду благодарен за любой совет. Есть вот такой проектик: https://github.com/jobpav1984/flutter_troubles/blob/master/lib/main.dart - 4 таба в каждом свой Navigator и соответственно стек. "/" - главная страничка со списком в NestedScrollView, "/details" - также список, также в NestedScrollView. Проблема следующая, если войти в /details в любом табе, потом перейти в другой таб и вернуться в предидущий, то при возврате в "/" будет нарушен assert в NestedScrollVIew который проверяет наличие body.
источник

AP

Alexey Perelygin in Flutter Developers — русскоговорящее сообщество
вот видео где можно увидеть как именно воспроизвести проблему
источник

VV

Vitaliy Vostrikov in Flutter Developers — русскоговорящее сообщество
Я в том чатике ответил: ```
class ListPage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return DefaultTabController(
     length: 1,
     child: NestedScrollView(
       headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
         return <Widget>[
           SliverOverlapAbsorber(
             handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
             sliver: SliverAppBar(title: Text("Items List")),
           ),
         ];
       },
       body: TabBarView(children: [
         SafeArea(
           top: false,
           bottom: false,
           child: Builder(
             builder: (BuildContext context) {
               return CustomScrollView(
                 key: PageStorageKey<String>('_'),
                 slivers: <Widget>[
                   SliverOverlapInjector(
                     handle: NestedScrollView.sliverOverlapAbsorberHandleFor(
                         context),
                   ),
                   SliverFixedExtentList(
                     itemExtent: 48.0,
                     delegate: SliverChildBuilderDelegate(
                       (BuildContext context, int index) {
                         return ListTile(
                           title: Text("item #$index"),
                           onTap: () => Navigator.pushNamed(
                               context, "/details",
                               arguments: index),
                         );
                       },
                       childCount: 55,
                     ),
                   )
                 ],
               );
             },
           ),
         )
       ]),
     ),
   );
 }
}

```
Не уверен, но можно попробовать.
источник

AP

Alexey Perelygin in Flutter Developers — русскоговорящее сообщество
Vitaliy Vostrikov
Я в том чатике ответил: ```
class ListPage extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
   return DefaultTabController(
     length: 1,
     child: NestedScrollView(
       headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
         return <Widget>[
           SliverOverlapAbsorber(
             handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context),
             sliver: SliverAppBar(title: Text("Items List")),
           ),
         ];
       },
       body: TabBarView(children: [
         SafeArea(
           top: false,
           bottom: false,
           child: Builder(
             builder: (BuildContext context) {
               return CustomScrollView(
                 key: PageStorageKey<String>('_'),
                 slivers: <Widget>[
                   SliverOverlapInjector(
                     handle: NestedScrollView.sliverOverlapAbsorberHandleFor(
                         context),
                   ),
                   SliverFixedExtentList(
                     itemExtent: 48.0,
                     delegate: SliverChildBuilderDelegate(
                       (BuildContext context, int index) {
                         return ListTile(
                           title: Text("item #$index"),
                           onTap: () => Navigator.pushNamed(
                               context, "/details",
                               arguments: index),
                         );
                       },
                       childCount: 55,
                     ),
                   )
                 ],
               );
             },
           ),
         )
       ]),
     ),
   );
 }
}

```
Не уверен, но можно попробовать.
Спасибо, но, к сожалению, совсем не про то:)
источник

M

Maria in Flutter Developers — русскоговорящее сообщество
Alexey Perelygin
Привет всем! Нужна ваша помощь:) Буду благодарен за любой совет. Есть вот такой проектик: https://github.com/jobpav1984/flutter_troubles/blob/master/lib/main.dart - 4 таба в каждом свой Navigator и соответственно стек. "/" - главная страничка со списком в NestedScrollView, "/details" - также список, также в NestedScrollView. Проблема следующая, если войти в /details в любом табе, потом перейти в другой таб и вернуться в предидущий, то при возврате в "/" будет нарушен assert в NestedScrollVIew который проверяет наличие body.
вот тут предложили задать extendBody: true для скаффолда и вроде это работает https://stackoverflow.com/questions/58339739/nestedscrollview-issue-throwing-error-when-switching-between-two-screens
источник

M

Maria in Flutter Developers — русскоговорящее сообщество
ошибка может из-за построения всего навигационного стека при переходе по вкладкам. Почему не используете такой подход: https://medium.com/coding-with-flutter/flutter-case-study-multiple-navigators-with-bottomnavigationbar-90eb6caa6dbf?
источник

AP

Alexey Perelygin in Flutter Developers — русскоговорящее сообщество
Спасибо огромное, вроде бы помогло. Судя по всему проблема крылась в неправильном подсчете FlexWidget из за extendedBody.
источник