TextField回車換行控制
// 鍵盤確認(rèn)鍵樣式
textInputAction: TextInputAction.search,
// 實(shí)現(xiàn)該方法,阻止onSubmitted 鍵盤回落
onEditingComplete: () {
// 自定義回車換行融涣, flutter沒有找到換行方式
String _temp = _controller.text + '\n';
_controller.text = _temp;
/// 控制光標(biāo)在最后一個(gè)字符
_controller.selection = TextSelection.fromPosition(TextPosition(
affinity: TextAffinity.downstream, offset: _temp.length));
},
onSubmitted: (v) {
print(_controller.text);
},
獲取 上文中 provider 方式
// 取context(必須在創(chuàng)建ChangeNotifierProvider 的context后面才能獲取搭到)上的provider對(duì)象
cartModel = ChangeNotifierProvider.of<CartModel>(context, listen: false).方法();
userViewModel = context.read<UserViewModel>();
定義局部ChangeNotifierProvider
ChangeNotifierProvider(
create: (_) => CallNumberViewModel(),
child: CallNumberKeyBoardWidget(
),
);
tips: ViewModel 如果不關(guān)聯(lián)UI漱抓,僅 viewModel.addListener(), 監(jiān)聽狀態(tài)表锻,頁面dispose 不會(huì)觸發(fā)ViewModel 的dispose,也就是說需要手動(dòng)才能釋放乞娄。
@override
void dispose() {
viewModel.dispose();
super.dispose();
}
系統(tǒng)控件(CupertinoSwitch)無法改變大小瞬逊,可以變更scale
Transform.scale(
scale: 0.8,
child: CupertinoSwitch(
value: true,
onChanged: (v) {},
activeColor: AIColor.primary,
trackColor: AIColor.buttonBorder,
),
)
Completer 同步轉(zhuǎn)異步
Future<bool> checkBindedBoxStatus() async {
ServerBoxBindType bindType = await _checkBindBox();
if (bindType == ServerBoxBindType.bindOther) {
/// 異步狀態(tài)器
Completer<bool> completer = new Completer();
AIRaisedDialog.showDialog(
'當(dāng)前會(huì)議室已關(guān)聯(lián)其他Pad的小智云匯控,是否替換仪或?',
ontapConfirm: () {
completer.complete(true);
},
ontapCancel: () {
completer.complete(false);
},
);
/// completer.future不會(huì)立即執(zhí)行确镊, 會(huì)等待 completer.complete 結(jié)束后才回調(diào)
return completer.future;
} else if (bindType == ServerBoxBindType.error) {
return false;
} else {
return true;
}
}
Completer 設(shè)置超時(shí)時(shí)間》渡荆可以用于不同邏輯(websocket 信令發(fā)送蕾域,結(jié)響應(yīng))綁定在一起實(shí)現(xiàn)類似Http請(qǐng)求,request =》response 方式回調(diào)
// 定義變量
Completer? _task;
// 創(chuàng)建 Completer
// 設(shè)置超時(shí)時(shí)間
_task = Completer();
_task!.future.timeout(Duration(seconds: 60), onTimeout: () {
// 超時(shí) 回調(diào)
},
);
// ======================
// 響應(yīng) 成功后到旦,結(jié)束Completer旨巷,完成任務(wù),
_task?.complete(null);
_task = null;
ListView相關(guān)scrollview滾動(dòng)問題
如果沒有可滾動(dòng)區(qū)域厢绝,使用不當(dāng)會(huì)報(bào)錯(cuò)
assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
原因
1契沫、調(diào)用了animateToPage
2、獲取了 .offset
解決方案:
if(_pageController.hasClients) {
/// 做相關(guān)處理
}
Future<void> animateTo(
double offset, {
@required Duration duration,
@required Curve curve,
}) {
assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
final List<Future<void>> animations = List<Future<void>>(_positions.length);
for (int i = 0; i < _positions.length; i += 1)
animations[i] = _positions[i].animateTo(offset, duration: duration, curve: curve);
return Future.wait<void>(animations).then<void>((List<void> _) => null);
}
Dart 2.12 版本開始支持空安全
- 空安全之前昔汉;所有對(duì)象都可以為null懈万, 即所有對(duì)象都繼承Null對(duì)象
- 空安全之后; 所有對(duì)象基類為Object靶病,Null 分離獨(dú)立出來会通。Null 與 Object 分開