Как передать свойства родительского виджета 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]}');
},
);
});
}
}