NotifyListeners Не перестраивает виджет во флаттере - PullRequest
0 голосов
/ 26 мая 2020

Я создаю приложение, в котором есть экран с множеством текстовых полей, которые вы можете перемещать и настраивать. Я хочу изменить размер шрифта текстовых полей, нажав кнопку, которая находится в отдельном виджете с отслеживанием состояния. Поэтому я попытался реализовать пакет поставщика, объявив класс уведомителя об изменениях следующим образом:

class ChangeNotifierList with ChangeNotifier {
  List<Widget> memeWidgets= new List();
  void add(Widget widget){
    memeWidgets.add(widget);
    notifyListeners();
  }
  void remove(Widget widget){
    memeWidgets.remove(widget);
    notifyListeners();
  }
  void increaseFontSize(StateTextField widget){
    widget.increaseFontSize();
    notifyListeners();

  }
}

И одним нажатием кнопки я изменяю размер шрифта текстового поля, например:

onTap: () {
                setState(() {
                  Provider.of<ChangeNotifierList>(context,listen: false)
                      .increaseFontSize(widget.textField);
                  //widget.textField.increaseFontSize();
                });
              }

Мои виджеты отображаются в стеке, который определяется следующим образом:

Container(
                height: MediaQuery.of(context).size.height * 0.8,
                child: Consumer<ChangeNotifierList>(
                  builder: (context, value, child) {
                    return Stack(children: value.memeWidgets);
                  },
                ),
              )

А мой виджет textField выглядит следующим образом:

class StateTextField extends StatefulWidget {
  GlobalKey key = GlobalKey();
  final FocusNode focusNode = FocusNode();
  final Function(bool, Widget) callback;
  final String fontFamily = FontFamily.Arial.toString().split('.')[1];
  double fontSize = 18;
  final Function(bool) selected;
  final bool highlighted = false;
  bool hasFocus() {
    return focusNode.hasFocus;
  }

  increaseFontSize() {
    fontSize += 2;
  }

  decreasefontSize() {
    if (fontSize > 0) fontSize -= 2;
  }

  // increaseFontSize() {
  //   fontSize += 2;
  // }

  // decreasefontSize() {
  //   if (fontSize > 0) fontSize -= 2;
  // }

  StateTextField(
      {@required this.callback,
      @required this.selected,
      @required this.fontSize});
  @override
  _StateTextFieldState createState() => _StateTextFieldState();
}

Я знаю, что проблема в том, что измененный размер шрифта не передается в класс состояния, как мне это преодолеть?

...