重学flutter第一天(已修改)

今天学习了如何设置flutter,并新建了第一个flutter项目,我的环境是macos加vscode,使用的是快捷键,shitf+commond+p键呼出插件栏,选择创建flutter项目,然后再栏目中输入flutter项目的名称,之后会自定义选择目录,在这个目录下会生成初始项目。

 

之后选择模拟器,关联模拟器,再然后开启flutter项目,有两种方式 run without debugging 和 run with debugging。后者会启动热更新即reload。

 

flutter的入口文件为main.dart文件;初始内容如下:

 

 1 import 'package:flutter/material.dart';
 2 
 3 void main() => runApp(MyApp());
 4 
 5 class MyApp extends StatelessWidget {
 6   @override
 7   Widget build(BuildContext context) {
 8     return MaterialApp(
 9       title: 'Flutter Demo',
10       theme: ThemeData(
11         primarySwatch: Colors.green,
12       ),
13       home: MyHomePage(title: '陈黎明 1111'),
14     );
15   }
16 }
17 
18 class MyHomePage extends StatefulWidget {
19   MyHomePage({Key key, this.title}) : super(key: key);
20 
21   final String title;
22 
23   @override
24   _MyHomePageState createState() => _MyHomePageState();
25 }
26 
27 class _MyHomePageState extends State<MyHomePage> {
28   int _counter = 0;
29 
30   void _incrementCounter() {
31     setState(() {
32       _counter++;
33     });
34   }
35 
36   @override
37   Widget build(BuildContext context) {
38     
39     return Scaffold(
40       appBar: AppBar(
41         title: Text(widget.title),
42       ),
43       body: Center(
44         child: Column(
45           mainAxisAlignment: MainAxisAlignment.center,
46           children: <Widget>[
47             Text(
48               'You have pushed the button this many times:',
49             ),
50             Text(
51               '$_counter',
52               style: Theme.of(context).textTheme.display1,
53             ),
54           ],
55         ),
56       ),
57       floatingActionButton: FloatingActionButton(
58         onPressed: _incrementCounter,
59         tooltip: 'Increment',
60         child: Icon(Icons.add),
61       ), // This trailing comma makes auto-formatting nicer for build methods.
62     );
63   }
64 }

 

相对于第一节课,无用信息太多,只捡主要的,入口文件有一个入口函数,类似c语言,就是main函数,main函数调用runApp函数,runApp的参数为MyApp函数的调用,听着绕口,看代码:

 void main() => runApp(MyApp()); 

比较难理解的是MyApp是个什么玩意,是一个类的实例,这个实例继承了statelesswidgit类的特性并进行了重写,代码如下:

 1 class MyApp extends StatelessWidget {
 2   @override
 3   Widget build(BuildContext context) {
 4     return MaterialApp(
 5       title: 'Flutter Demo',
 6       theme: ThemeData(
 7         primarySwatch: Colors.green,
 8       ),
 9       home: MyHomePage(title: '陈黎明 1111'),
10     );
11   }
12 }

 

可以看到上图代码,MyApp继承了无状态组件,并在内部使用@override进行了重写。重写除了使用@override关键字,还是用了widget关键字,widget关键字声明了一个build函数,这个函数传递一个参数,参数类型为BuildContext,这里的参数也使用了生命式的写法,如下:

 BuildContext context 

函数内部通过return 返回了另外一个函数MaterialApp函数,这个函数是一个组件,这个组件设置App的名称,主题,home主页的主题。 这个函数传递参数的写法也比较有意思,总的参数类似对象,但是最外层却没有{},如果是按照单个参数进行传递的,中间却有冒号,例如title:'flutter demo',theme:'...',这种使用方法需要注意,叫做命名参数。 以上代码嵌套了太多返回函数,其实可以简化为如下代码如:

 

void main() => runApp(MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.green,
      ),
      home: MyHomePage(title: ' 444444'),
    ));

 

runApp函数的参数本质就是一个MaterialApp组件。但上面这种写法就不支持热更新了,原因如下:

main() 方法里的更改不能使用 Hot Reload,因为 main() 方法不会因重建窗口小部件树而重新执行,所以更改 main() 方法里的代码,不会在 Hot Reload 之后看到效果。在main函数外面更改就可以,也就是组件生命成一个函数,然后将函数传入main函数中,这样修改函数组件,就会实现热更新,但是如果直接将组件传入main函数中,热更新就会失效。

如果不是使用热更新可以使用restart,其实就是控制面板,闪电和restart的区别。⚡️ 和 ↩️ 有什么区别。

 

今天就学这么多,总结一下:

 

1、如何用vscode新建一个flutter项目。

2、flutter的入口文件和入口函数 main函数。

3、入口函数如何使用、其参数是什么样的 ,runApp函数和myApp函数,命名参数的使用方法。

4、MyApp函数怎么声明的,即类的实例化怎么使用,其关键字@override的使用。

5、声明式的用法,widget生命一个build函数,build参数的函数的定义 BuildContext context。

6、关键字 Widget、build、BuildContext、MaterialApp 、StatelessWidget、StateWidget、@overide、Scaffold、AppBar、Center等等。

7、哪些情况下热更新不起作用,该如何办。

 

posted @ 2020-10-14 16:27  挥刀  阅读(138)  评论(0编辑  收藏  举报