用Android Studio和VS Code创建的Flutter应用模板是一个简单的计数器示例,本节先仔细讲解一下这个计数器Demo的源码,让读者对Flutter应用程序结构有个基本了解,在随后小节中,将会基于此示例,一步一步添加一些新的功能来介绍Flutter应用的其它概念与技术。对于接下来的示例,希望读者可以跟着笔者实际动手来写一下,这样不仅可以加深印象,而且也会对介绍的概念与技术有一个真切的体会。如果你还不是很熟悉Dart或者没有移动开发经验,不用担心,只要你熟悉面向对象和基本编程概念(如变量、循环和条件控制),则可以完成本示例。
通过Android Studio和VS Code根据前面“编辑器配置与使用”一章中介绍的创建Flutter工程的方法创建一个新的Flutter工程,命名为"first_flutter_app"。创建好后,就会得到一个计数器应用的Demo。
注意,默认Demo示例可能随着编辑器Flutter插件版本变化而变化,本例中会介绍计数器示例的全部代码,所以不会对本示例产生影响。
我们先运行此示例,效果图如下:
该计数器示例中,每点击一次右下角带“➕”号的悬浮按钮,屏幕中央的数字就会加1。
在这个示例中,主要Dart代码是在 lib/main.dart 文件中,下面我们看看该示例的源码:
import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return new MaterialApp( title: '【全栈编程】-onajax.com', theme: new ThemeData( primarySwatch: Colors.blue, ), home: new MyHomePage(title: '【全栈编程】-onajax.com'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( title: new Text(widget.title), ), body: new Center( child: new Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ new Text( '【全栈编程】-onajax.com提示:你已经点击了--', ), new Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: new FloatingActionButton( onPressed: _incrementCounter, tooltip: '【全栈编程】-onajax.com', child: new Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } } 分析 1.导入包 import 'package:flutter/material.dart';此行代码作用是导入了Material UI组件库。Material是一种标准的移动端和web端的视觉设计语言, Flutter默认提供了一套丰富的Material风格的UI组件。
2.应用入口 void main() => runApp(new MyApp());与C/C++、Java类似,Flutter 应用中main函数为应用程序的入口,main函数中调用了,runApp 方法,它的功能是启动Flutter应用,它接受一个Widget参数,在本示例中它是MyApp类的一个实例,该参数代表Flutter应用。
main函数使用了(=>)符号,这是Dart中单行函数或方法的简写。
MyApp类代表Flutter应用,它继承了 StatelessWidget类,这也就意味着应用本身也是一个widget。
在Flutter中,大多数东西都是widget,包括对齐(alignment)、填充(padding)和布局(layout)。
Flutter在构建页面时,会调用组件的build方法,widget的主要工作是提供一个build()方法来描述如何构建UI界面(通常是通过组合、拼装其它基础widget)。
MaterialApp 是Material库中提供的Flutter APP框架,通过它可以设置应用的名称、主题、语言、首页及路由列表等。MaterialApp也是一个widget。
Scaffold 是Material库中提供的页面脚手架,它包含导航栏和Body以及FloatingActionButton(如果需要的话)。 本书后面示例中,路由默认都是通过Scaffold创建。
home 为Flutter应用的首页,它也是一个widget。
4.首页 class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => new _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { ... }