之前,我們正向的學習了一些flutter的基礎,如MaterialApp,Scaffold之類的東西,那么接下來,我們將正式接觸原代碼:
import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),),home: const MyHomePage(title: 'Flutter Demo Home Page'),);}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(backgroundColor: Theme.of(context).colorScheme.inversePrimary,title: Text(widget.title),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[const Text('You have pushed the button this many times:'),Text('$_counter',style: Theme.of(context).textTheme.headlineMedium, ),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter, tooltip: 'Increment', child: const Icon(Icons.add), ), );}
}
補充:為什么說在flutter里面,萬物皆為widget?
widget是flutter里面的一個類,由于好多類的創建都是繼承于它,可以說絕大部分都來自于widget,包括但不限于之前看見的,Text,Scaffold,所以就有了這個說法
接下來,我們將逐行講解:
import 'package:flutter/material.dart';void main() {runApp(const MyApp());
}
與之前不同的是,這里我們直接調用了MyApp,這里并非是調用類,雖然說MyApp確實是一個類,但是實際上這里是創建了一個類的實例,MyApp并非是flutter自帶的類,而是后面我們創建的,見下:
class MyApp extends StatelessWidget {const MyApp({super.key});@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),),home: const MyHomePage(title: 'Flutter Demo Home Page'),);}
}
這里我們可以看見,MyApp是繼承了StatelessWidget的一個類,如果這個時候你按住ctrl鍵,然后點擊StatelessWidget,你就會發現StatelessWidget就是繼承自Widget類,正好印證了上面的“萬物皆為widget”的說法。
第一步自然是將StatelessWidget的屬性繼承過來,也就是通過super方法,調用父類的構造函數,值得注意的是,由于所有的widget都繼承于widget,而widget有一個key屬性,所以是super.key,key可以幫助程序識別widget的身份
這里的title指的是外面的名稱,不是頁面內,而是指啟動程序后,程序的名稱(當然,要改設置,不然你看見的名稱應該是文件名,或者通過其他代碼來修改,這里就先不說),在theme里面,可以設置主題顏色,通過seedColor,可以根據實際情況生成合適的顏色背景,而不用每個地方都由自己設置
最后,設置主界面,當然,這里可以看見,我們通過MyHomePage創建了一個實例,而之于MyHomePage是什么,請見下方,在此之前,還有一個title,這個title指的是標題處的title,也就是主界面頂部的位置的標題
class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;@overrideState<MyHomePage> createState() => _MyHomePageState();
}
這里我們可以看見,MyHomePage繼承于StatefulWidget(當然,按住ctrl鍵點擊StatefulWidget,你會發現它繼承于Widget),首先我們通過super方法,繼承父類的構造函數,當然,我們這里需要一個標題,因為是MyHomePage嘛,所以這里還要一個“required this.title”,required表示這個是必須的,而this.title則是將傳入的參數值直接賦值給當前類的 title 屬性,當然,這里面還沒有title,所以需要下面的final String title來接收,值得注意的是,這里使用的是final,所以值傳入后將不可修改
最后通過@override進行重寫父類方法
在StatefulWidget中,有個方法叫做createState方法,這里就是重寫這個方法
首先,通過State限定類型,必須是 State<具體Widget類型> 的子類,而最后的_MyHomePageState則是創建并返回狀態的對象實例,要注意的是,這里的_MyHomePageState是私有的,因為前面加了“_”。
那么今天就先到這啦,祝大家天天開心!代碼一遍就通!沒有debug的煩惱!如果有講的不好或者不對的地方,可以指出,博主會修正噠!
?