Почему дочернее состояние StatefulWidget не сбрасывается при изменении параметра конструктора? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть собственный класс виджетов:

class FancyButton extends StatefulWidget
{
  final Function() onTap;
  final String text;
  final IconData icon;
  bool enabled;

  FancyButton({this.onTap, this.text, this.icon, this.enabled = true})

  @override
  _FancyButtonState createState()
  {
    return _FancyButtonState(onTap, text, icon, enabled);
  }
}

class _FancyButtonState extends State<FancyButton> with SingleTickerProviderStateMixin
{
  Function() onTap;
  String text;
  IconData icon;
  bool enabled;
  _FancyButtonState(this.onTap, this.text, this.icon, this.enabled);

  @override
  Widget build(BuildContext context) {
    if(!enabled)
      {
        print("build disabled");
      }
    return GestureDetector(
      onTap: onTap,
      child: Container(
          color: enabled ? Colors.red : Colors.green,
          height: 20
      ),
    );
  }
}

Я использую его так:

Widget continueButton = new StreamBuilder(
          stream: viewModel.canFinishProfile.asBroadcastStream(),
          initialData: viewModel.canFinishProfile.value,
          builder: (builder, snapshot)
          {
            print("can finish profile " + viewModel.canFinishProfile.value.toString());
            return FancyButton(
              text: multilang.get("auth_continue"),
              enabled: viewModel.canFinishProfile.value,
              onTap: ()
              {
                viewModel.onClickedContinue.add(null);
              },
            );
          },
        )

Так что я ожидаю, что виджет обновится после изменения значения canFinishProfile. Проблема в том, что состояние FancyButton не обновляется при изменении значения canFinishProfile, поэтому всегда отображается старый виджет. Обратите внимание, что если я заменил FancyButton на StatelessWidget и поместил его код сборки в StatelessWidget, то он хорошо перерисовывается aws один раз, а затем может изменить значение canFinishProfile. Однако мне нужно, чтобы он был StatefulWidget для более сложной функции.

1 Ответ

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

Вы State класс сможете прослушивать изменения состояния в вашем StatefulWidget классе, если вы используете свойство widget для доступа к состоянию.

Вам необходимо изменить:

enabled ? Colors.red : Colors.green

до

widget.enabled ? Colors.red : Colors.green

Надеюсь, это поможет.

...