最近有個(gè)flutter項(xiàng)目中根據(jù)搜索結(jié)果跳轉(zhuǎn)到相應(yīng)的H5頁(yè)面發(fā)現(xiàn)老是報(bào)錯(cuò)裕膀,曾現(xiàn)在閑暇拉出來(lái)解決哈
先來(lái)看一個(gè)搜索功能的測(cè)試
已進(jìn)入詳情頁(yè)面就提示錯(cuò)誤,尷尬了柑营。
只有去檢測(cè)代碼了撒
Search.dart
SearchItem item = searchModel.data[position];
print(item.url);
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => WebView(
url: item.url,
title: '詳情',
)));
},
檢測(cè)該處并無(wú)問(wèn)題,于是繼續(xù)向上查找,找到了Search_model.dart
class SearchModel{
String keyword;
final List<SearchItem> data;
SearchModel({this.data});
factory SearchModel.fromJson(Map<String,dynamic>json){
var dataJson = json['data'] as List;
List<SearchItem> data = dataJson.map((i)=>SearchItem.fromJson(i)).toList();
return SearchModel(data:data);
}
}
確認(rèn)該處也沒(méi)問(wèn)題,那么問(wèn)題可能是json格式化類(lèi)SearchItem
class SearchItem
class SearchItem{
final String word; //xx酒店
final String type; //hotel
final String price ; //實(shí)時(shí)計(jì)價(jià)
final String star ; //豪華型
final String zonename ; //虹橋
final String districtname ; //上海
final String url ;
SearchItem({this.word, this.type, this.price, this.star, this.zonename,
this.districtname, this.url});
factory SearchItem.fromJson(Map<String,dynamic>json){
return SearchItem(
word: json['word'],
type: json['type'],
price: json['price'],
star: json['star'],
zonename: json['zonename'],
districtname:json['districtname'],
url:json['url']
);
}
Map<String, dynamic> toJson(){
Map<String,dynamic> data = new Map<String,dynamic>();
data['icon'] = this.word;
data['title'] = this.type;
data['price'] = this.price;
data['star'] = this.star;
data['zonename'] = this.zonename;
data['districtname'] = this.districtname;
data['url'] = this.url;
return data;
}
}
打眼看去是否也沒(méi)什么問(wèn)題呀愕秫,那為是么無(wú)法進(jìn)入詳情頁(yè)面呢,經(jīng)過(guò)再次閱讀代碼發(fā)現(xiàn)toJson方法好像并無(wú)用處(這個(gè)好像是上次測(cè)試
Text(object)渲染對(duì)象焰络,需要進(jìn)行序列化時(shí)留下的)
于是果斷干掉戴甩,再測(cè)試(當(dāng)初斷定是這個(gè)引起的因?yàn)槲覄h除這個(gè)方法測(cè)試過(guò)一次OK了)
但是事實(shí)并非想象的那么簡(jiǎn)單(gradle.properties
和 build.gradle
的dependencies
都改了一遍--抓狂),再次測(cè)試依然一樣報(bào)錯(cuò)
最后一次次找舔琅,才發(fā)現(xiàn)實(shí)從Android 9.0(API級(jí)別28)開(kāi)始等恐,默認(rèn)情況下禁用明文支持。因此http的url均無(wú)法在webview中加載
解決方法:在AndroidManifest.xml
的applaction
節(jié)點(diǎn)中添加android:usesCleartextTraffic="true"
即可(害我找了半天)
如:
<application
android:name="io.flutter.app.FlutterApplication"
android:label="flutter_test"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher">
<!-- ... another configure -->
</application>
另外如果是ios 則在 info.plist中增加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
再測(cè)試哈
總算OK了备蚓,特此記錄课蔬,避免再入坑