Как вызвать виджет без сохранения состояния в методе сборки MyApp, состояние которого управляется его родителем с отслеживанием состояния - PullRequest
0 голосов
/ 20 июня 2020

Я следовал руководствам по флаттеру для управления состоянием виджета от его родителя по этой ссылке [https://flutter.dev/docs/development/ui/interactive#parent -managed] [1], и я не могу понять, как бы вызвать виджет в этом случае

Ответы [ 2 ]

0 голосов
/ 20 июня 2020
  • , если вы хотите вызвать его в методе сборки MyApp, вам нужно будет сделать MyApp виджетом с отслеживанием состояния, чтобы он мог управлять состоянием указанного виджета
void main() => runApp(MyApp());

//we make MyApp to be a stateful widget
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  //we define the state which will be used in the widget here
  var myState = "something";
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: Center(
          child: Container(
            //the data used by MyWidget is managed by MyApp which is a statefull widget.
            child: MyWidget(state: myState),
          ),
        ),
      ),
    );
  }
}

Или, скорее, оберните свой виджет другим виджетом с отслеживанием состояния, который вы будете использовать в методе сборки MyApp

//we create a widget which will manage the state of its children class MyStateManagingWidget extends StatefulWidget {   @override  
_MyStateManagingWidgetState createState() => _MyStateManagingWidgetState(); }

class _MyStateManagingWidgetState extends State<MyStateManagingWidget> {   var myState = "some state";   @override   Widget build(BuildContext context) {
    //we put our widget who's state is to be managed here
    return MyWidget();   } }

class MyApp extends StatelessWidget {   @override   Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: Center(
          child: Container(
              //we now use  the state managing widget here
              child: MyStateManagingWidget()),
        ),
      ),
    );   } }
0 голосов
/ 20 июня 2020

это очень просто, как только вы получите logi c.

На практике родительский ("истинный" виджет, который вы вызываете), т.е.

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

является тот, который вы вызываете где угодно и когда угодно в остальной части кода.

Поскольку это виджет Stateful , это означает, что он заявил (для простоты он будет управлять любые изменения в пользовательском интерфейсе). Произойдет любое изменение, он изменит свое состояние, поэтому этот код:

class _ParentWidgetState extends State<ParentWidget> {
  bool _active = false;

  void _handleTapboxChanged(bool newValue) {
    setState(() {
      _active = newValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: TapboxB(
        active: _active,
        onChanged: _handleTapboxChanged,
      ),
    );
  }
}

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

setState(() {
      oldValue= newValue;
    });

Он перестроит весь виджет, изменив то, что вам нужно (например, тексты, изображения, виджеты и т. Д.). неправильным образом , рассматривайте его как особый виджет, который может изменять свой пользовательский интерфейс в течение времени.

...