上QQ阅读APP看书,第一时间看更新
1.1.3 MyHomePage与_MyHomePageState分析
下面是关于MyHomePage的代码,这段代码是应用程序的主页面。MyHomePage继承自StatefulWidget,是可变状态组件。它持有父组件(MyApp)提供的值(如本例的title)。可变状态组件可以借助State类完成状态的更改,比如这里的_MyHomePageState。
class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); }
如果你对于可变状态有点不理解,现在完全不用担心,之后你会一点点认识它。这里_MyHomePageState继承自State类,并且以MyHomePage为泛型。这样在_MyHomePageState里就可以使用MyHomePage中的属性(如widget.title)。
State抽象类有一个build抽象方法,返回Widget对象,就说明Scaffold也是Widget类型。如果仔细去看Scaffold下的每个属性对应的类型,可以惊奇地发现AppBar、Center、Column、Text、FloatingActionButton、Icon全是Widget。
_MyHomePageState中有一个状态量_counter,在点击“+”按钮时,会触发自增的方法。此时_counter就会加1,我们想要的就是将新的状态展现在屏幕上。setState方法就起到这个作用:通知Flutter框架重新执行build方法,渲染出最新的状态。
class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title),), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( 'You have pushed the button this many times:' ), Text('$_counter', style: Theme.of (context).textTheme.display1),] ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); } }
总结一下:可变状态组件拥有一个状态类,可以用来决定自身的表现。状态类可以获取组件中的属性进行显示。每次状态类中调用setState方法,都会更新界面信息。
可见,仿佛Widget构建了整个界面,这也难怪初学者会认为Flutter世界一切皆Widget。也许新手会对这种布局结构有些抵触,先保留你的态度。随着你的深入了解,你会被Flutter视图强大的复用性和表现力折服。