Flutter之旅
上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视图强大的复用性和表现力折服。