Может ли StreamBuilder вернуть List <Widget>

An AppBar в трепете принимает List<Widget>как действия. По какой-то причине я не могу найти способ кормить это свойство на основеStreamBuilder.

У меня есть BehaviorSubject (может изменяться на другие типы потока), в который я добавляю виджеты, и я хочу показать эти виджеты в AppBar (как кнопки действий)

// ....

var appBar = new AppBar(
        title: "appTitle",
        actions: _getActionWidgets()   // <= Can be fed by SteamBuilder?
      )
/// ...


// ...
// BehaviorSubject<Widget> actionWidgets;
// ...

List<Widget> _getActionWidgets(){
  return StreamBuilder(
    ... // what can be done here so that this method would return List<Widget>
  );

}

Большинство примеров для "ListView" используя ListView.builder(...) что не применимо в моем случае здесь.

Конечная цель - накормить actions свойство AppBarиспользуя StreamBuilder и пытаясь найти способ. Я признателен за любую помощь или указания и спасибо за то, что вы уделили время чтению моего вопроса.

2 ответа

Решение

Нет, это не так. Действиями в вашем случае обычно являются кнопки (FlatButton, IconButton и т. Д.). Ваш случай может выглядеть примерно так:

class Bloc {
  final _subject = BehaviourSubject<List<Widget>>();
  ...  
}
void initState() {
  super.initState();
  // Prepare actions depending on condition
  final actions = [
    FlatButton(child: Text('Action 1'), onPressed: () {}),
    FlatButton(child: Text('Action 2'), onPressed: () {}),
  ];
  bloc.setActions(actions); // indeed send actions to sink
}

Widget build(BuildContext context) {
  return StreamBuilder<List<Widget>>(
    stream: bloc.actionStream, // Function of `bloc` which returns Stream<List<Widget>> (indeed IconButton, FlatButton)
    builder: (context,snapshot) {
      return Scaffold(
        appBar: AppBar(
          actions: snapshot.hasData? snapshot.data : <Widget>[],
        ),
      );
    }
  );
}

Просто заполнить actions с одноэлементным List, содержащий StreamBuilder:

actions: [
    StreamBuilder(
        builder: (context, snapshot) {
            return Row(children: [
                // Your widgets here
            ]);
        }
    ),
]
Другие вопросы по тегам