這是個(gè)產(chǎn)假作業(yè)。故事是這樣的。
濉溪ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
生了娃,生活一地雞毛。擦,碎鈔機(jī)的需求怎么那么多。
當(dāng)時(shí),有一堆返利優(yōu)惠券app比較火
...這里扯多了這篇文章被鎖了....
我就想,來(lái)扒一扒,他們是怎么賺錢的。
結(jié)論:淘寶聯(lián)盟。
淘寶聯(lián)盟是阿里巴巴旗下的親兒子,不那么有名是因?yàn)槭莻€(gè)私生子吧,官網(wǎng)上還有個(gè)沒(méi)聽(tīng)過(guò)的名號(hào)叫“阿里媽媽”,呵呵。淘寶聯(lián)盟是給淘寶上推廣商品的人用的,他們有一個(gè)專門的名稱,叫做淘寶客,即“推廣者(Publisher)”,他們幫電商平臺(tái)推薦商品給別的買家,買家購(gòu)買后,電商平臺(tái)可以增加銷量,而他們則可以獲得推廣傭金。
后來(lái),知道京東也有自己的聯(lián)盟平臺(tái),叫做“京東聯(lián)盟”,拼多多也有,叫做“多多進(jìn)寶”。
回到這些app的賺錢邏輯上來(lái)。對(duì)于用戶而言,它們的兩個(gè)噱頭是:
“用我們的app買,你可以自用省錢”
“用我們的app,分享給別人下單,你可以賺錢!”
所以,這些app推廣起來(lái)很容易啊,因?yàn)檎l(shuí)用誰(shuí)賺錢呀!
那么為何不自己搭一個(gè)呢?
與其這些傭金落到別人口袋,不如自己直接做最頂層上線,發(fā)展出N個(gè)下線,豈不是躺著賺錢,哈哈哈哈哈
搞清楚賺錢邏輯之后,我發(fā)現(xiàn)淘寶聯(lián)盟的api是很開(kāi)放的。
商品鏈接: ;pid=mm_343780171_368000361_101527600308itemId=595640102734src=qtka_wxxtdx=1
其中,activityId是優(yōu)惠券id,pid是推廣者在阿里媽媽官網(wǎng)注冊(cè)的id,只有這個(gè)id是我注冊(cè)的,那么傭金就到我口袋去了,哈哈哈。
剛好練一下flutter,一次開(kāi)發(fā),兩端使用,我一個(gè)人就可以了。app暫時(shí)取名為“小豬購(gòu)”,拿粉紅豬貼牌。
演示視頻:
國(guó)外地址:
國(guó)內(nèi)鏡像:
以 flutter_screenutil 為例
路由框架 annotation_route
狀態(tài)管理 provider
UI適配 flutter_screenutil
刷新控件 flutter_easyrefresh
網(wǎng)絡(luò)請(qǐng)求 dio
toast控件 fluttertoast
圖表庫(kù) charts_flutter
網(wǎng)絡(luò)監(jiān)聽(tīng) connectivity
事件總線 event_bus
日歷組件 table_calendar
官方webview webview_flutter
第三方webview flutter_webview_plugin
該篇文章為常用依賴包總結(jié),用來(lái)記錄所需要的常用依賴包,后續(xù)會(huì)不斷擴(kuò)充內(nèi)容~
眾所周知,小程序是由HTML標(biāo)簽來(lái)開(kāi)發(fā)原生組件,那么首先需要將HTML做解析,這里我們將HTML通過(guò)node腳本解析成JSON字符串,再用Dart來(lái)解析JSON,映射對(duì)應(yīng)的標(biāo)簽到flutter的組件。這里先簡(jiǎn)單介紹實(shí)現(xiàn)的功能以及展示效果,后續(xù)再詳細(xì)介紹。
為了高效解析,直接用flutter的組件名在HTML文件上開(kāi)發(fā)
直接使用flutter的組件
模仿微信小程序的Api,cc對(duì)應(yīng)是微信小程序的wx
以上HTML中的例子
《使用Flutter + V8/JsCore開(kāi)發(fā)小程序引擎(二)》
《使用Flutter + V8/JsCore開(kāi)發(fā)小程序引擎(三)》
記錄下自己踩過(guò)的坑,怕忘了
一.TextField:
1.去掉輸入數(shù)字的計(jì)數(shù):decoration中的counterStyle: TextStyle(color: Colors.transparent).
2.去掉獲取和失去焦點(diǎn)時(shí)邊框改變顏色的效果:decoration內(nèi)border: InputBorder.none,
3.去邊框時(shí)設(shè)置BorderSide的width為0或color: Colors.transparent后依然存在邊框時(shí),需要設(shè)置為borderSide: BorderSide.none
4.設(shè)置背景色需要在decoration內(nèi) ? ? filled:true, ? fillColor: Colors.blue同時(shí)設(shè)置才會(huì)顯示
二.Uint8List類型和string類型,Listint的轉(zhuǎn)換
連續(xù)兩次base64解碼時(shí),參數(shù)只能使用string類型,但是base64解碼后是Uint8List類型,此時(shí)需要將Uint8List類型轉(zhuǎn)換為string類型,使用:utf8.decode(Uint8List)即可,需要import 'dart:convert';
Listint轉(zhuǎn)Uint8List:讀取接口時(shí)獲取的數(shù)據(jù)是Listint的圖片數(shù)據(jù),想顯示時(shí)需要轉(zhuǎn)成Uint8List,然后使用Image.memory(),使用:Uint8List.fromList(Listint)即可
三.報(bào)錯(cuò):DioError [DioErrorType.DEFAULT]: FormatException: Unexpected character (at character 1)MGFlMFo0NEZ3RWNMbE5YbGNGOXZGcUlJdUhIS2x2Q3NlckxqWXlEeG5JWndZdXIrSUpLN3ZOczR...
這是因?yàn)閐io請(qǐng)求返回的數(shù)據(jù)默認(rèn)是以json的格式讀取的,而返回的數(shù)據(jù)是密文形式,需要修改dio的Options的responseType為ResponseType.PLAIN,這樣返回的數(shù)據(jù)就以字符串形式處理.
四.去掉點(diǎn)擊控件背景出現(xiàn)的水波紋效果,即去掉md的效果:
在main.dart的MaterialApp內(nèi)的theme加上splashColor: Colors.transparent
五.布局去掉沉浸式效果和布局設(shè)置占滿全屏卻無(wú)效的問(wèn)題
使用Scaffold的body的布局默認(rèn)是沉浸式的,將狀態(tài)欄一起包含了,可以通過(guò)在body后添加一層SafeArea即可.
布局設(shè)置double.infinity占滿全屏高度卻無(wú)效,大部分情況都是因?yàn)槟骋患?jí)的父布局的高度已經(jīng)有了限制,所以設(shè)置充滿屏幕只會(huì)充滿父布局,有些widget默認(rèn)是按內(nèi)容填充類似wrap_content就會(huì)導(dǎo)致寫布局的過(guò)程中自己沒(méi)有限制高度但最后的布局不是自己想要的,可以給各個(gè)父布局設(shè)置不同背景顏色來(lái)查看是從哪兒開(kāi)始被限制了高度來(lái)排查問(wèn)題.
六.占滿剩余空間,類似android的match_parent可以使用double.infinity
七.LinearProgressIndicator
1.LinearProgressIndicator設(shè)置進(jìn)度值的顏色為單一顏色:valueColor : new AlwaysStoppedAnimation(Color(JColor.blue))
2.給LinearProgressIndicator設(shè)置圓角:ClipRRect(
borderRadius:BorderRadius.circular(60.0),
child:LinearProgressIndicator(value:0.2,backgroundColor:Color(JColor.grayBg),valueColor:new AlwaysStoppedAnimation(Color(JColor.blue)),
)
八.Expanded:
1.若嵌套多層column且內(nèi)容的高度都不確定需要占滿剩余空間,需要每層的column的內(nèi)容都嵌套一層expanded來(lái)申明每層都占滿剩余的空間,否則最里面的內(nèi)容層需要指定高度,不然會(huì)報(bào)錯(cuò)
九.Container設(shè)置最小/大寬度或高度:
constraints:BoxConstraints(minHeight:56),
十.滑動(dòng)的widget嵌套:
1.解決滑動(dòng)沖突:內(nèi)層嵌套的滑動(dòng)widget設(shè)置physics:NeverScrollableScrollPhysics()
2.解決滑動(dòng)嵌套u(yù)i顯示不出來(lái)或者報(bào)錯(cuò),內(nèi)層的滑動(dòng)widget設(shè)置shrinkWrap:true
十一.使用multi_image_picker: ^4.3.4安卓運(yùn)行報(bào)錯(cuò)Didn't find class "com.sangcomz.fishbun.FishBunFileProvider"
1.需要android工程支持androidx,需要在android工程的gradle.properties內(nèi)添加android.enableJetifier=true和android.useAndroidX=true并點(diǎn)擊右上角的open for editing in android studio,運(yùn)行成功后就可以了
十二.使用textfield時(shí)的文字ui總是很高
使用了maxlength且只是在textfield的InputDecoration設(shè)置counterStyle的顏色為透明使下面的計(jì)數(shù)文字消失會(huì)導(dǎo)致文字ui很高,counter的計(jì)數(shù)文字只是顏色是透明但依然在布局中占了位置所以導(dǎo)致文字很高,直接使用counterText:""即可
十三.使用ListView報(bào)錯(cuò)Vertical viewport was given unbounded height
需要將ListView放入Expanded內(nèi)部