颤动渲染小部件状态如何工作?

时间:2019-04-20 20:40:08

标签: flutter

我曾经使用过flutter,但是有点使flutter渲染引擎如何工作感到困惑。某些地方很奇怪

Flutter被认为是在setState()被调用时发生的。引擎将重新渲染我们在build方法中描述的小部件。我的理解是所有小部件都会重新创建,所以我可能会丢失子小部件中的当前状态。

但是我错了。即使我尝试将参数发送到那些子小部件的构造函数,子小部件内的所有状态仍然是持久的。通过构造函数将新值应用于子小部件(似乎再次创建了它们),但是状态值仍然保持不变。

之后,我尝试发送1个有状态小部件实例,但将其放入Column中2次(我想它来自同一时刻,因此其中的数据,状态必须进行相应更改),但我又错了。好像我有2个瞬间,渲染后它们具有自己的状态。

请在下面考虑我的代码

import 'package:flutter/material.dart';
class TestWidget extends StatefulWidget{
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _TestWidgetState();
  }

}


class _TestWidgetState extends State<TestWidget>{

  String _text = "";

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
   print('TestWidget build');

   Widget wg2 = new TestWidget2(name:_text);
   return Scaffold(
     appBar: AppBar(
       title: Text(_text),
     ),
     body: Center(
       child: Column(
         children: <Widget>[

           TextField(
             onChanged: (_val) {
               this.setState((){
                 _text = _val;
               });
             },
           ),
           wg2,
           Container(
             color: Colors.red,
             height: 20,
           ),
           wg2
         ],
       ),
     ),
   );
  }
}

//============================


class TestWidget2 extends StatefulWidget{

  String name;
  TestWidget2({this.name});
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _TestWidgetState2();
  }

}


class _TestWidgetState2 extends State<TestWidget2>{

  String _text = "";

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    print('TestWidget build');
    return Center(

        child: Container(

          color: Colors.tealAccent,
          child:  Column(
            children: <Widget>[

              TextField(
                onChanged: (_val) {
                  this.setState((){
                    _text = _val;
                  });
                },
              ),
              Text(_text),
              Divider(),
              Text(widget.name)
            ],
          ),
        ),
      );

  }
}

我希望如果我重新渲染屏幕。我应该获取所有新创建的小部件,以便重置所有状态。而且,如果我将同一个即时消息传递到小部件的布局中,而不管它有多少次,那么我应该让小部件显示在屏幕上,并且其中的小部件应该具有对应的状态,数据,因为它来自同一即时

如果我误会了,请告诉我。

谢谢。

0 个答案:

没有答案