1.ListView和GridView嵌套滑動沖突問題
ListView(
shrinkWrap: true,//增加
children: <Widget>[
new GridView.count(
physics: new NeverScrollableScrollPhysics(),//增加
shrinkWrap: true,//增加
crossAxisCount: 3,
children:<Widget>[]
],
)
關(guān)鍵代碼:
GridView添加 physics: new NeverScrollableScrollPhysics() 和 shrinkWrap: true
2.Tab切換或滑動的狀態(tài)保存問題
如果是底部導(dǎo)航欄切換推薦使用IndexedStack
組件忠聚,會自動保存狀態(tài)所森,也可按如下方案:
1.State
組件實現(xiàn)AutomaticKeepAliveClientMixin
2.重寫wantKeepAlive
為true
實例:
class _TabViewWidgetState extends State<TabViewWidget> with AutomaticKeepAliveClientMixin{
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return SizeBox();
}
@override
bool get wantKeepAlive => true;
3.庫名沖突
比如自定義繪制 ParagraphBuilder
的pushStyle
方法贱勃,你會發(fā)現(xiàn)TextStyle
導(dǎo)入的包始終是爆紅的冶匹,這是因為庫名沖突了,解決方案:
import 'dart:ui' as other; //重點 命一個別名
class MyDraw extends CustomPainter{
@override
void paint(Canvas canvas, Size size) {
final textStyle = other.TextStyle( //前面加一個別名就好了
.........
);
final paragraphBuilder = ParagraphBuilder(paragraphStyle)
..pushStyle(textStyle)
.....代碼省略
}
}
需要注意的是別名最好不要和類名一樣俏站,因為如果需要調(diào)用靜態(tài)方法或者導(dǎo)入方法會報錯韭脊,造成別名和類名的沖突
4 jsonDecode
解析出來的map是什么類型?
打印一下就知道,結(jié)果是LinkedHashMap
5 Positioned 大小問題
Positioned
需要定義3個方向的屬性才會有寬高屬性,否則是無法確定寬高的塞帐,子組件也無寬高那么就會報錯,示例如下:
Positioned(
....
top: 0,
left: 0,
right: 0,
)
6 TextField的一些問題解決方案
1.去掉底部文字計數(shù)器
在InputDecoration屬性里設(shè)置counterText :' '
2.TextField無邊框文字居中問題
經(jīng)過測試TextField
設(shè)置了border: InputBorder.none
無邊框后文字無法居中拦赠,設(shè)置了邊框后又可以。所以實現(xiàn)無邊框和文字居中的方案是添加一個透明邊框:
border: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
)
2.TextField換行問題
有時候需要實現(xiàn)個備份填寫等長文本葵姥,需要限制字?jǐn)?shù)和自動換行荷鼠,可以這么實現(xiàn):
Container(
alignment: Alignment.topLeft,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(8)),
color: editBackground),
child: TextField(
keyboardType: TextInputType.multiline, //多文本
minLines: 1,
maxLines: 20, //一定要設(shè)置,不然不會換行榔幸,具體設(shè)置多大視需求而定
maxLength: 200, //設(shè)置了這個底部就會出現(xiàn)文字計數(shù)器
decoration: InputDecoration(
isDense: true, //解決多行文本之間的間距
border: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
color: Colors.transparent,
),
)),
),
)
7. setStatue更新問題
1.setStatue出現(xiàn)不能更新的問題颊咬,需要著重檢查更新布局的context, 父布局一定是具有State狀態(tài)管理功能的組件,否則不能更新
2.彈窗dialog不能直接調(diào)用setStatue進行更新牡辽,因為context是不一樣的,ui刷新并不能更新到彈窗敞临,怎么辦呢态辛,可使用StatefulBuilder
局部更新組件來進行更新. 簡單使用:
StatefulBuilder(
builder: (BuildContext context,
void Function(void Function()) _statue) {
return InkWell(
onTap: () => {
_statue(() { //調(diào)用_statue來完成局部更新,調(diào)用后StatefulBuilder里的組件會重新刷新一遍
mBean.oilTag = "$i$title";
})
},
child: Container(
alignment: Alignment.centerRight,
child: Text(
isNotEmpty(mBean.oilTag) ? mBean.oilTag! : "請選擇",
style: TextStyle(
color: isNotEmpty(mBean.oilTag)
? colorText
: color999),
),
),
);
},
)
或者直接使用彈窗的context進行更新,示例如下:
(context as Element).markNeedsBuild(); //標(biāo)記這個context下的組件需要更新
這樣彈窗會從上到下更新一遍ui
關(guān)于這一塊的詳細解釋挺尿,請參考這里,篇幅有限奏黑,不詳細解析哈。
- ValueNotifier不更新
檢查ValueNotifier里的對象和新的更改的對象是否是同一個编矾,例如集合熟史,如果操作的是同一個集合,那么是不會觸發(fā)更新的 - 簡單總結(jié)一下局部更新的一些組件:
-
StatefulBuilder
: 該組件相當(dāng)于是一個小型的StatefulWidget
,暴露出一個方法用于局部更新 -
ValueListenableBuilder
: 當(dāng)監(jiān)聽的數(shù)據(jù)有變化時更新窄俏,一般配合ValueNotifier
使用 -
StreamBuilder
: 流數(shù)據(jù)變化監(jiān)聽蹂匹,AsyncSnapshot會有多種狀態(tài),使用connectionState
可以獲取對應(yīng)的狀態(tài)凹蜈,適合網(wǎng)絡(luò)請求等耗時操作 -
FutureBuilder
: Future方法監(jiān)聽, 與StreamBuilder 差不多,但是傳入的是一個Future方法限寞,需要注意當(dāng)調(diào)用全局的setState
會有重復(fù)刷新的問題,需要額外處理規(guī)避
8.流(Stream)的使用
分享一篇講解的分享好的文章
“四大天王”:StreamController仰坦,Sink履植,Stream,StreamSubscription 的詳細說明
9.集成地圖問題
集成地圖提示
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/amap/api/maps/AMapOptions;
檢查一遍發(fā)現(xiàn)AMapOptions
有這個類呀悄晃,怎么會找不到玫霎,后面發(fā)現(xiàn)這個類和源碼里導(dǎo)入的類包名不一樣,我使用的是2D地圖的類,而flutter里的是使用的3D的庶近,破案了翁脆,把安卓里引入的地圖包從2d改成3d即可。