一些语法积累
?
用于创建可为空的变量,或者对象不为空则调用他的方法
??
如果前边的值为空,就用后边的值替换他
1 2
| String? name; String greeting = "Hello, " + name ?? "stranger";
|
!
如果使用为空的变量时,变量后加叹号表示手动指定该变量不为空
..
可以用于连续调用多个方法,方法需要返回一个对象才能调用
1 2 3 4 5
| var result = foo()..bar()..baz();
var t1 = foo(); var t2 = t1.bar(); var result = t2.baz();
|
as
用于将模糊类型转为指定类型
1
| String firstLink = _tvLinks[0] as String;
|
数组
给函数中传入方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
class A{ String name = ""; setName(value) { name = value; }
getNameFromB() { B()..handleName(setName); } }
class B{ String currentName = ""; handleName(handler) { handler(currentName); } }
|
常用对象
屏幕相关
1 2
| window.physicalSize.width
|
全局key
1 2
| final GlobalKey _webViewKey = GlobalKey<State<StatefulWidget>>();
|
context相关
1 2 3 4
| context.findAncestorStateOfType<State<FijkTvPlayer>>()!.context;
globalKey.currentState
|
Navigator
1 2 3 4
| Navigator.pushNamed(context, "tv_player", arguments: arg);
Navigator.pop(context, "二级页面返回值");
|
Future
1 2 3 4 5 6 7 8 9 10
| try { tvData = await loadTvDataFromNetwork() .timeout(const Duration(seconds: requestTimeout)); } on TimeoutException { tvData = await loadTvDataFromLocal(); }
Future.delayed(Duration(seconds: 2).then((e){print("11");})
|
日志
- 依赖包
logger: ^1.3.0
- 仓库链接
1 2 3 4 5 6 7
| final Logger logger = Logger( level: Level.debug, printer: PrettyPrinter(), ); logger.d(); logger.i(); logger.w();
|
功能型代码片
返回键监听
需要放到所有组件顶层
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| DateTime? _lastPressedAt;
WillPopScope( child: Column(), onWillPop: () async { if (_lastPressedAt == null || DateTime.now().difference(_lastPressedAt!) > Duration(seconds: 1)) { _lastPressedAt = DateTime.now(); return false; } return true; } )
|
手机常亮
1 2
| Wakelock.enable(); Wakelock.disable();
|