Flutter: Только перерисовать виджет, где был вызван setState () - в структуре вложенных объектов - PullRequest
0 голосов
/ 28 июня 2019

Как Flutter отображает виджеты, было подробно описано здесь.Он будет сравнивать новый со старым виджетом.Поэтому Flutter обычно знает, как повторно визуализировать пользовательский интерфейс в большинстве случаев.

В структуре вложенных объектов все родительские виджеты неизбежно изменяются при изменении дочернего элемента, поэтому они кажутся новыми.

Это приводит к непривлекательным визуальным эффектам для пользователя приложения.

Есть ли способ перерисовать только виджет, в котором был вызван SetState ()?

Я пробовал видыэтого.setState (() {}).Я поменял виджеты в классе без состояний.

К сожалению, оба подхода не решают проблему.

Виджет _createCheckbox (int dataArrayPosition, int elementCurrentPosition, int inputCurrentPosition) {Input inputElement = contextData.data [dataArrayPosition] .element [elementCurrentPosition] .input [inputCurrentPosition];

return Column(
  children: <Widget>[
    Row(
      children: <Widget>[
        Checkbox(
            value: inputElement.checkBoxValue,
            onChanged: (bool newValue) {
              setState(() {
                contextData.data[dataArrayPosition].element[elementCurrentPosition].input[inputCurrentPosition].checkBoxValue = newValue;
              });
            }),
        Text(inputElement.labelForValue),
      ],
    ),
  ],
);

}

Кто-нибудь знает способ перерисовки только «затронутого» виджета в этом примерекогда вызывался onChanged?

1 Ответ

0 голосов
/ 02 июля 2019

Пакет Flutter «Image_Picker» сохраняет фотографии в виде переменных типа «Файл».Я преобразовал фотографию в конструкцию jSON.Фотографии были сохранены как BASE64.Возможно, чтобы конструкция Base64 отображалась в виджете.К сожалению, Flutter, кажется, не замечает при рендеринге, что это всегда одно и то же изображение, когда вы используете изображение BASE64.Поэтому эффект мерцания возникает, если пользователь вводит новые данные.

Этот код работает без проблем.

    var picturesTaken = <File>[];

    Widget _showFoto(int currentFoto) {
      return Padding(
          padding: const EdgeInsets.only(bottom: 10.0),
          child: Container(
            child: Padding(
              padding: const EdgeInsets.all(20.0),
              child: Center(
                child: Column(
                  children: <Widget>[
                    Image.file(picturesTaken[currentFoto])
                  ],
                ),
              ),
            ),
          )
      );
    }
...