Как передать свойства родительского виджета TabBarView списку его детей?

Подскажите мне пожалуйста как мне передать в этом месте (указано красными стрелочками) переменные состояния виджета из родителя? если виджет TabBarView запрашивает список константных виджетов в которые можно передать лишь статистические переменные которых в родительском виджете нежелательно создавать

Вот пример этого константного списка:

List<Widget> kTabPages = [
  RadioList(),
  FavouriteRadioList(),
  Column(
    children: <Widget>[
      Center(
          child: Icon(Icons.shopping_basket, size: 120.0, color: Colors.blue)),
      PayApp(),
    ],
  ),
];

Дерево виджетов


Ответы (2 шт):

Автор решения: Дмитрий Окладной

Данные из любого места в дереве виджетов можно передавать с использованием глобальных переменных или глобальных потоков

→ Ссылка
Автор решения: Дмитрий Окладной

По просьбам ответственных людей - "состряпал" маленький примерчик как решить эту проблему

// Создаю глобальную переменную контроллера потока
StreamController<List<Data>> gStreamController;

// Допустим у меня имеется объект с какими-то нужными данными
class Data {}

class SomeProperty {
  List<Data> getSomeProperty() {
    return [Data()];
  }
}

//Какой-то виджет из которого нужно передать свойства в любой другой виджет
class WidgwtInOhteTree extends StatelessWidget {
  final List<Data> data;

  const WidgwtInOhteTree({Key key, this.data}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    List<Data> data = SomeProperty().getSomeProperty();
    gStreamController.add(data);
    return Container();
  }
}

class AnyWidget extends StatefulWidget {
  @override
  _AnyWidgetState createState() => _AnyWidgetState();
}

class _AnyWidgetState extends State<AnyWidget> {

   // перезаписываем внутреннюю функцию [didChangeDependencies()] в [StatefulWidget]
  @override
  void didChangeDependencies() async{
    // Тут (на всякий случай проверяем закрытие контролера)
   await gStreamController?.close();
   // Тут его создаем.
    gStreamController = StreamController();
    super.didChangeDependencies();
  }

// перезаписываем внутреннюю функцию [dispose()] в [StatefulWidget]
  @override
  void dispose() {
    // Тут закрываем поток (когда происходит закрытие вашего виджета)
    gStreamController?.close();
    super.dispose();
  }
  
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<List<Data>>(
        // Место перехвата данных которые были отправлены в строке [gStreamController.add(data);]
        stream: gStreamController.stream,
        builder: (context, AsyncSnapshot<List<Data>> snapshot) {
          List<Data> data = snapshot.data;
          // Из [data] уже строить то отображение которое думал
          return ListView.builder(
            itemBuilder: (BuildContext context, int index) {
              return Text('${data[index]}');
            },
          );
        });
  }
}
→ Ссылка