0. 第一次启动本地卡死

  • android / build.gradle
  1. buildscript {
  2. repositories {
  3. maven { url 'https://maven.aliyun.com/repository/google' }
  4. maven { url 'https://maven.aliyun.com/repository/jcenter' }
  5. maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
  6. }
  7. // ...
  8. }
  9. allprojects {
  10. repositories {
  11. maven { url 'https://maven.aliyun.com/repository/google' }
  12. maven { url 'https://maven.aliyun.com/repository/jcenter' }
  13. maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
  14. }
  15. }

0. 继承父级的颜色

  1. Theme.of(context).primaryColor;

1. MediaQuery获取当前设备的信息

1.1 设置全局沉侵式状态

  1. void main(List<String> args) {
  2. runApp(MyApp());
  3. // 启动程序后,重新设置沉侵式状态栏
  4. if (Platform.isAndroid) {
  5. SystemUiOverlayStyle style =
  6. SystemUiOverlayStyle(statusBarColor: Colors.transparent);
  7. SystemChrome.setSystemUIOverlayStyle(style);
  8. }
  9. }

1.2 获取设备状态栏高度

  1. // 获取设备状态栏高度
  2. double height = MediaQuery.of(context).padding.top;

1.3 获取设备的宽高

  1. // 获取设备状态栏高度, 返回一个Size对象
  2. 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)
  1. Scaffold(
  2. // 设置appBar 高度为200
  3. appBar: PreferredSize(
  4. preferredSize: Size.fromHeight(200),// // appBar的高度,不含状态栏的高度
  5. child: Container(
  6. color: Colors.blue,
  7. ),
  8. ),
  9. body: Test1(),
  10. )
  • 使用 PreferredSize 设置AppBar只显示状态栏
  1. return Scaffold(
  2. appBar: PreferredSize(
  3. child: AppBar(
  4. brightness: Brightness.dark,
  5. backgroundColor: Colors.blue, // 状态栏的高度
  6. elevation: 0,
  7. ),
  8. preferredSize: Size.fromHeight(0), // appBar的高度,不含状态栏
  9. ),
  10. )

2. 路由页面跳转

2.1 路由 直接跳转(不带参数)

  1. // 引入 Home 页面
  2. RaisedButton(
  3. onPressed: () {
  4. Navigator.push(
  5. context,
  6. MaterialPageRoute(
  7. builder: (_) => Home(),
  8. ),
  9. );
  10. },
  11. child: Text("直接跳转页面"),
  12. ),

2.2 路由 直接跳转(带参数)

  • 携带参数
  1. RaisedButton(
  2. onPressed: () {
  3. Navigator.push(
  4. context,
  5. MaterialPageRoute(
  6. builder: (_) => Home("我是参数"),
  7. ),
  8. );
  9. },
  10. child: Text("路由跳转"),
  11. ),
  • 接收参数
  1. class Home extends StatelessWidget {
  2. final String msg;
  3. // 构造方法
  4. Home(this.msg);
  5. @override
  6. Widget build(BuildContext context) {
  7. return Scaffold(
  8. appBar: AppBar(
  9. title: Text("home page"),
  10. ),
  11. body: Text(msg),
  12. );
  13. }
  14. }

2.2 命名路由跳转(不带参数)

  1. 先配置所有路由
  1. MaterialApp(
  2. title: "Hello World",
  3. debugShowCheckedModeBanner: false,
  4. theme: ThemeData(
  5. primarySwatch: Colors.red,
  6. visualDensity: VisualDensity.adaptivePlatformDensity),
  7. routes: {
  8. "/": (_) => HomePage(),
  9. "/home": (_) => Home(),
  10. "/mine": (_) => MinePage(),
  11. },
  12. );
  1. 命名路由跳转
  1. RaisedButton(
  2. onPressed: () {
  3. Navigator.pushNamed(context, "/mine");
  4. },
  5. child: Text("命名路由跳转"),
  6. ),

2.3 命名路由跳转(携带参数)

  1. // 配置路由
  2. MaterialApp(
  3. title: "Hello World",
  4. debugShowCheckedModeBanner: false,
  5. theme: ThemeData(
  6. primarySwatch: Colors.red,
  7. visualDensity: VisualDensity.adaptivePlatformDensity,
  8. ),
  9. // 路由生成监听函数
  10. onGenerateRoute: (RouteSettings settings) {
  11. // print('build route for ${settings.name}');
  12. var routes = <String, WidgetBuilder>{
  13. "/": (_) => HomePage(),
  14. "/home": (conetxt) => Home(settings.arguments),
  15. "/mine": (_) => MinePage(),
  16. };
  17. WidgetBuilder builder = routes[settings.name];
  18. return MaterialPageRoute(builder: (ctx) => builder(ctx));
  19. },
  20. );
  21. // 路由代参跳转
  22. RaisedButton(
  23. onPressed: () {
  24. Navigator.pushNamed(context, "/home", arguments: {"kw": "123456"});
  25. },
  26. child: Text("命名路由跳转"),
  27. ),
  28. // 接收参数的页面
  29. class Home extends StatelessWidget {
  30. // 接收参数
  31. final payload;
  32. Home(this.payload, {Key key}) : super(key: key);
  33. @override
  34. Widget build(BuildContext context) {
  35. return Scaffold(
  36. appBar: AppBar(
  37. title: Text("home page"),
  38. ),
  39. body: Text(this.payload.toString()),
  40. );
  41. }
  42. }

4. dart 基础语法

4.1 变量

  • 未初始化的变量默认值是 null
  1. // var 关键字 创建一个变量并进行初始化:
  2. var name = 'Bob';
  3. // dynamic(动态类型) 关键字创建变量
  4. dynamic name = 'Bob';
  5. // 具体指定是什么类型
  6. String name = "Bob";

4.2 Final 和 Const

  • 使用过程中从来不会被修改的变量, 可以使用 finalconst
  • Final 变量的值只能被设置一次;
  • Const 变量在编译时就已经固定 (Const 变量 是隐式 Final 的类型.) 最高级 final 变量或类变量在第一次使用时被初始化
  • 如果需要在编译时就固定变量的值,可以使用 const 类型变量

实例变量可以是 **final** 类型但不能是 **const** 类型

4.3 字符串与数字的互转

  1. // String -> int
  2. var one = int.parse('1');
  3. // String -> double
  4. var onePointOne = double.parse('1.1');
  5. // int -> String
  6. String oneAsString = 1.toString();
  7. // double -> String
  8. String piAsString = 3.14159.toStringAsFixed(2);

4.4 函数(类型Function)

  • 函数示例
  1. main(List<String> args) {
  2. print(add(10, 2));
  3. }
  4. // 定义一个函数
  5. int add(int a, int b) {
  6. return a + b;
  7. }

4.5 命名可选参数

  • 定义函数,使用 {*param1*, *param2*, …} 来指定命名参数:
  1. main(List<String> args) {
  2. // 调用传参
  3. say(name: "李磊", age: 20);
  4. }
  5. // 命名参数{类型 参数名, 类型 参数名}
  6. void say({String name, int age}) {
  7. print(name);
  8. print(age);
  9. }

4.6 位置可选参数

  • 将参数放到 [] 中来标记参数是可选的:
  1. main(List<String> args) {
  2. // print(add(10, 2));
  3. print(say("老二", "hello")); // => 老二 says hello
  4. print(say("老二", "hello", "么么哒")); // => 老二 says hello with a 么么哒
  5. }
  6. /**
  7. * 位置可选参数
  8. * @params {from}
  9. * @params {msg}
  10. * @params {device} 可选参数
  11. */
  12. String say(String from, String msg, [String device]) {
  13. var result = '$from says $msg';
  14. if (device != null) {
  15. result = '$result with a $device';
  16. }
  17. return result;
  18. }

4.7 默认参数值

  • 在定义方法的时候,可以使用 = 来定义可选参数的默认值。
  • 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null。
  1. main(List<String> args) {
  2. hello("李斯特");
  3. }
  4. // 默认参数(非可选参数不能具有默认值。)
  5. String say(String name, int age) {
  6. return name + " : " + age.toString();
  7. }
  8. // 使用在命名可选参数 中
  9. String world({String name = "李四", int age}) {
  10. return name + " : " + age.toString();
  11. }
  12. // 使用在命名可选参数 中
  13. String hello(String name, [String msg = "韩束在一册", int sex]) {
  14. print(name);
  15. print(msg);
  16. print(sex);
  17. }

4.8 类的使用

  • 类的定义
  1. main(List<String> args) {
  2. App app = App("电视", "小米");
  3. print(app.brand); // => 小米
  4. print(app.name); // => 电视
  5. }
  6. // 定义一个类
  7. class App {
  8. String name, brand;
  9. App(this.name, this.brand);
  10. }
  • 使用 ?. 来代替 . , 可以避免因为左边对象可能为 null , 导致的异常