Flutter Widgets - доступ к родительскому потоку - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть потоковое построение на домашнем экране вот так:

Затем у меня есть SilverListDelegate, в котором есть список виджетов

class _HomeScreenState extends State<HomeScreen> {
  @override
  Widget build(BuildContext context) {
    final auth = AuthProvider.of(context).auth;
    return Scaffold(
        body: StreamBuilder<User>(
            stream: auth.user,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                User user = snapshot.data;
                return CustomScrollView(
                  slivers: <Widget>[
                    SliverList(
                      delegate: SliverChildListDelegate([
                        SizedBox(height: 40),
                        userImageWidget,
                        userNameWidget,
                        ....,

виджеты определены внутри класса HomeScreenState, например this:

  Widget userNameWidget = Text('Show Username',
      textAlign: TextAlign.center,
      style: TextStyle(
        fontSize: 28,
        fontWeight: FontWeight.bold,
        color: Colors.white,
      ));

Как я могу получить имя пользователя из потока в этом случае?

Я знаю, что если бы я просто поместил код Text непосредственно в SliverList, я мог бы сказать: Text(user.firstName), но это не сработало бы, если я поместил его в виджет выше, поскольку он выбрасывает неопределенное имя: пользователь '.

Спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Вы должны извлечь собственный виджет для текстового виджета. Затем вы можете передать ему значение.

class UserTextWidget extends StatelessWidget {
  final String username;

  const UserTextWidget({Key key, this.username}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Text('Show $username',
        textAlign: TextAlign.center,
        style: TextStyle(
          fontSize: 28,
          fontWeight: FontWeight.bold,
          color: Colors.white,
        ));
  }
}

В качестве альтернативы вы можете создать метод, который возвращает текстовый виджет вместо переменной.

  Widget userNameWidget(String username){
    return Text('Show $username',
      textAlign: TextAlign.center,
      style: TextStyle(
        fontSize: 28,
        fontWeight: FontWeight.bold,
        color: Colors.white,
      ));

https://codepen.io/md-weber/pen/LYpWWdr

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...