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 高度为200
appBar: 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);
@override
Widget 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);
@override
Widget 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 -> int
var one = int.parse('1');
// String -> double
var onePointOne = double.parse('1.1');
// int -> String
String oneAsString = 1.toString();
// double -> String
String 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 hello
print(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 , 导致的异常