Flutter setState () не обновляет виджет при вызове из дочернего элемента с сохранением состояния - PullRequest
2 голосов
/ 06 августа 2020

У меня есть два виджета с отслеживанием состояния: ParentWidget и ChildWidget.

У ChildWidget есть детектор жестов, обертывающий контейнер и текст. Когда я вызываю onTap, состояние Parent (статус увеличивается на 1) обновляется правильно, но setState () не обновляет пользовательский интерфейс.

Я пробовал все: глобальные ключи, унаследованный виджет, но ничего не работает.

Интересно, что если я изменю ChildWidget на без сохранения состояния, тогда все начнет работать. Любые идеи были бы очень полезны. pk

Вот код:

import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';

class ParentWidget extends StatefulWidget {
  @override
  _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  int status = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Hexcolor('#1c486d'),
        title: Text(
          'Test',
        ),
      ),
      body: ChildWidget(
        child: GestureDetector(
          onTap: () {
            status = status + 1;
            setState(() {}); // this is the problematic piece of code.
          },
          child: Container(
            color: Colors.blue,
            width: 100,
            height: 100,
            child: Text('PARENT:' + status.toString()),
          ),
        ),
      ),
    );
  }
}

class ChildWidget extends StatefulWidget {
  final Widget child;
  ChildWidget({this.child});
  @override
  _ChildWidgetState createState() => _ChildWidgetState(child);
}

class _ChildWidgetState extends State<ChildWidget> {
  Widget child;

  _ChildWidgetState(this.child);

  @override
  Widget build(BuildContext context) {
    return child;
  }
}

Ответы [ 2 ]

1 голос
/ 06 августа 2020

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

body: GestureDetector(
        onTap: () {
          setState(() {
            status = status + 1;
          });
        },
        child: ChildWidget(status: status),
      ),
    );
  }
}

class ChildWidget extends StatefulWidget {
  final int status;

  ChildWidget({this.status});
  @override
  _ChildWidgetState createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {
  _ChildWidgetState();

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.blue,
      width: 100,
      height: 100,
      child: Text('PARENT:' + widget.status.toString()),
    );
  }
}
0 голосов
/ 06 августа 2020

Старайтесь не делать дочерний элемент окончательным

  class ChildWidget extends StatefulWidget {
  Widget child;
  ChildWidget({this.child});

  @override
  _ChildWidgetState createState() => _ChildWidgetState(child);
  } 
...