0. 第一次启动本地卡死
- android / build.gradle
buildscript {repositories {maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }}// ...}allprojects {repositories {maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }}}
0. 继承父级的颜色
Theme.of(context).primaryColor;
1. MediaQuery获取当前设备的信息
1.1 设置全局沉侵式状态
void main(List<String> args) {runApp(MyApp());// 启动程序后,重新设置沉侵式状态栏if (Platform.isAndroid) {SystemUiOverlayStyle style =SystemUiOverlayStyle(statusBarColor: Colors.transparent);SystemChrome.setSystemUIOverlayStyle(style);}}
1.2 获取设备状态栏高度
// 获取设备状态栏高度double height = MediaQuery.of(context).padding.top;
1.3 获取设备的宽高
// 获取设备状态栏高度, 返回一个Size对象Size data = MediaQuery.of(context).size; // Size(392.7, 759.3)
| 属性 | 说明 | 例子 |
|---|---|---|
| size对象 | 设备的宽高,是一个对象{width, height} | size: Size(392.7, 759.3) |
1.4 自定义 Scaffold 中的 appBar 的高度
- 使用
PreferredSize自定义AppBar的高度(PreferredSize子控件为AppBar)
Scaffold(// 设置appBar 高度为200appBar: PreferredSize(preferredSize: Size.fromHeight(200),// // appBar的高度,不含状态栏的高度child: Container(color: Colors.blue,),),body: Test1(),)
- 使用
PreferredSize设置AppBar只显示状态栏
return Scaffold(appBar: PreferredSize(child: AppBar(brightness: Brightness.dark,backgroundColor: Colors.blue, // 状态栏的高度elevation: 0,),preferredSize: Size.fromHeight(0), // appBar的高度,不含状态栏),)
2. 路由页面跳转
2.1 路由 直接跳转(不带参数)
// 引入 Home 页面RaisedButton(onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (_) => Home(),),);},child: Text("直接跳转页面"),),
2.2 路由 直接跳转(带参数)
- 携带参数
RaisedButton(onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (_) => Home("我是参数"),),);},child: Text("路由跳转"),),
- 接收参数
class Home extends StatelessWidget {final String msg;// 构造方法Home(this.msg);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("home page"),),body: Text(msg),);}}
2.2 命名路由跳转(不带参数)
- 先配置所有路由
MaterialApp(title: "Hello World",debugShowCheckedModeBanner: false,theme: ThemeData(primarySwatch: Colors.red,visualDensity: VisualDensity.adaptivePlatformDensity),routes: {"/": (_) => HomePage(),"/home": (_) => Home(),"/mine": (_) => MinePage(),},);
- 命名路由跳转
RaisedButton(onPressed: () {Navigator.pushNamed(context, "/mine");},child: Text("命名路由跳转"),),
2.3 命名路由跳转(携带参数)
// 配置路由MaterialApp(title: "Hello World",debugShowCheckedModeBanner: false,theme: ThemeData(primarySwatch: Colors.red,visualDensity: VisualDensity.adaptivePlatformDensity,),// 路由生成监听函数onGenerateRoute: (RouteSettings settings) {// print('build route for ${settings.name}');var routes = <String, WidgetBuilder>{"/": (_) => HomePage(),"/home": (conetxt) => Home(settings.arguments),"/mine": (_) => MinePage(),};WidgetBuilder builder = routes[settings.name];return MaterialPageRoute(builder: (ctx) => builder(ctx));},);// 路由代参跳转RaisedButton(onPressed: () {Navigator.pushNamed(context, "/home", arguments: {"kw": "123456"});},child: Text("命名路由跳转"),),// 接收参数的页面class Home extends StatelessWidget {// 接收参数final payload;Home(this.payload, {Key key}) : super(key: key);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("home page"),),body: Text(this.payload.toString()),);}}
4. dart 基础语法
4.1 变量
- 未初始化的变量默认值是
null
// var 关键字 创建一个变量并进行初始化:var name = 'Bob';// dynamic(动态类型) 关键字创建变量dynamic name = 'Bob';// 具体指定是什么类型String name = "Bob";
4.2 Final 和 Const
- 使用过程中从来不会被修改的变量, 可以使用
final或const,- Final 变量的值只能被设置一次;
- Const 变量在编译时就已经固定 (Const 变量 是隐式 Final 的类型.) 最高级 final 变量或类变量在第一次使用时被初始化
- 如果需要在编译时就固定变量的值,可以使用
const类型变量
实例变量可以是 **final** 类型但不能是 **const** 类型
4.3 字符串与数字的互转
// String -> intvar one = int.parse('1');// String -> doublevar onePointOne = double.parse('1.1');// int -> StringString oneAsString = 1.toString();// double -> StringString piAsString = 3.14159.toStringAsFixed(2);
4.4 函数(类型Function)
- 函数示例
main(List<String> args) {print(add(10, 2));}// 定义一个函数int add(int a, int b) {return a + b;}
4.5 命名可选参数
- 定义函数,使用
{*param1*, *param2*, …}来指定命名参数:
main(List<String> args) {// 调用传参say(name: "李磊", age: 20);}// 命名参数{类型 参数名, 类型 参数名}void say({String name, int age}) {print(name);print(age);}
4.6 位置可选参数
- 将参数放到
[]中来标记参数是可选的:
main(List<String> args) {// print(add(10, 2));print(say("老二", "hello")); // => 老二 says helloprint(say("老二", "hello", "么么哒")); // => 老二 says hello with a 么么哒}/*** 位置可选参数* @params {from}* @params {msg}* @params {device} 可选参数*/String say(String from, String msg, [String device]) {var result = '$from says $msg';if (device != null) {result = '$result with a $device';}return result;}
4.7 默认参数值
- 在定义方法的时候,可以使用
=来定义可选参数的默认值。 - 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null。
main(List<String> args) {hello("李斯特");}// 默认参数(非可选参数不能具有默认值。)String say(String name, int age) {return name + " : " + age.toString();}// 使用在命名可选参数 中String world({String name = "李四", int age}) {return name + " : " + age.toString();}// 使用在命名可选参数 中String hello(String name, [String msg = "韩束在一册", int sex]) {print(name);print(msg);print(sex);}
4.8 类的使用
- 类的定义
main(List<String> args) {App app = App("电视", "小米");print(app.brand); // => 小米print(app.name); // => 电视}// 定义一个类class App {String name, brand;App(this.name, this.brand);}
- 使用
?.来代替., 可以避免因为左边对象可能为 null , 导致的异常
