Chad

优化支付过程

...@@ -28,4 +28,8 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> { ...@@ -28,4 +28,8 @@ abstract class BaseState<T extends StatefulWidget> extends State<T> {
28 toast(String text) { 28 toast(String text) {
29 EasyLoading.showToast(text); 29 EasyLoading.showToast(text);
30 } 30 }
31 +
32 + Widget buildLoading() {
33 + return const Center(child: CircularProgressIndicator());
34 + }
31 } 35 }
......
...@@ -65,6 +65,8 @@ class MembershipDataGoodsList { ...@@ -65,6 +65,8 @@ class MembershipDataGoodsList {
65 int? id; 65 int? id;
66 @JSONField(name: "membership_id") 66 @JSONField(name: "membership_id")
67 String? membershipId; 67 String? membershipId;
68 + @JSONField(name: "iap_id")
69 + String? iapId;
68 String? name; 70 String? name;
69 String? price; 71 String? price;
70 @JSONField(name: "line_price") 72 @JSONField(name: "line_price")
......
...@@ -54,6 +54,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -54,6 +54,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
54 setState(() {}); 54 setState(() {});
55 }); 55 });
56 if (SpUtil.containsKey(Constant.userToken)!) { 56 if (SpUtil.containsKey(Constant.userToken)!) {
57 + showLoading();
57 Provider.of<MembershipViewProvider>(context, listen: false).setSelectedMembership(null); 58 Provider.of<MembershipViewProvider>(context, listen: false).setSelectedMembership(null);
58 Provider.of<MembershipViewProvider>(context, listen: false).fetchMembershipData('0'); 59 Provider.of<MembershipViewProvider>(context, listen: false).fetchMembershipData('0');
59 } else { 60 } else {
...@@ -62,17 +63,14 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -62,17 +63,14 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
62 } 63 }
63 64
64 @override 65 @override
65 - void onFirstBuildBody(BuildContext context) {
66 - super.onFirstBuildBody(context);
67 - showLoading();
68 - }
69 -
70 - @override
71 Widget buildBody(BuildContext context) { 66 Widget buildBody(BuildContext context) {
67 + ///响应数据
72 apiResponse = Provider.of<MembershipViewProvider>(context).response; 68 apiResponse = Provider.of<MembershipViewProvider>(context).response;
73 if (apiResponse?.status != Status.LOADING) { 69 if (apiResponse?.status != Status.LOADING) {
74 hideLoading(); 70 hideLoading();
75 } 71 }
72 +
73 + ///写死背景加载会更快
76 var url = "https://api.parlando.ink/storage/images/274d864a62d277b2a29c4db39f92d591.png"; 74 var url = "https://api.parlando.ink/storage/images/274d864a62d277b2a29c4db39f92d591.png";
77 return Scaffold( 75 return Scaffold(
78 body: Container( 76 body: Container(
...@@ -90,10 +88,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -90,10 +88,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
90 ); 88 );
91 } 89 }
92 90
93 - Widget buildLoading() { 91 + ///底部一个磨砂玻璃区域
94 - return const Center(child: CircularProgressIndicator());
95 - }
96 -
97 Widget buildCompleteWidget() { 92 Widget buildCompleteWidget() {
98 MembershipData? mb = apiResponse?.data; 93 MembershipData? mb = apiResponse?.data;
99 return Container( 94 return Container(
...@@ -118,39 +113,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -118,39 +113,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
118 ); 113 );
119 } 114 }
120 115
121 - Widget initOtherEntrance() { 116 + ///会员内容区域
122 - return Row(
123 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
124 - mainAxisSize: MainAxisSize.min,
125 - crossAxisAlignment: CrossAxisAlignment.center,
126 - children: [
127 - TextButton(
128 - onPressed: () {},
129 - child: Text(
130 - "服务协议",
131 - style: TextStyle(fontSize: 14.px, color: Colors.white),
132 - ),
133 - ),
134 - Container(width: 0.6, height: 15.0, color: Colours.line),
135 - TextButton(
136 - onPressed: () {},
137 - child: Text(
138 - "隐私政策",
139 - style: TextStyle(fontSize: 14.px, color: Colors.white),
140 - ),
141 - ),
142 - Container(width: 0.6, height: 15.0, color: Colours.line),
143 - TextButton(
144 - onPressed: () {},
145 - child: Text(
146 - "恢复购买",
147 - style: TextStyle(fontSize: 14.px, color: Colors.white),
148 - ),
149 - ),
150 - ],
151 - );
152 - }
153 -
154 buildMemberContent(MembershipData? mb) { 117 buildMemberContent(MembershipData? mb) {
155 return Column( 118 return Column(
156 crossAxisAlignment: CrossAxisAlignment.center, 119 crossAxisAlignment: CrossAxisAlignment.center,
...@@ -166,6 +129,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -166,6 +129,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
166 ); 129 );
167 } 130 }
168 131
132 + ///返回行为
169 initBackBar() { 133 initBackBar() {
170 return Container( 134 return Container(
171 alignment: Alignment.centerLeft, 135 alignment: Alignment.centerLeft,
...@@ -178,23 +142,19 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -178,23 +142,19 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
178 ); 142 );
179 } 143 }
180 144
145 + ///购买项列表
181 buildProductWidget(MembershipData? mb) { 146 buildProductWidget(MembershipData? mb) {
182 - var widgets = mb?.goodsList?.map((e) => buildProductItem(e)).toList() ?? []; 147 + var widgets = mb?.goodsList?.map((e) => buildBuyItem(e)).toList() ?? [];
183 return Column(children: widgets); 148 return Column(children: widgets);
184 } 149 }
185 150
186 - Widget buildProductItem(MembershipDataGoodsList e) { 151 + ///每一个购买项
152 + Widget buildBuyItem(MembershipDataGoodsList e) {
187 ProductDetails? element; 153 ProductDetails? element;
188 - for (var value in _products) { 154 + var detailList = _products.where((value) => value.id == e.iapId).toList();
189 - if (value.id == e.membershipId || mapId(value.id, e.id)) { 155 + if (detailList.isNotEmpty) {
190 - element = value; 156 + element = detailList.first;
191 - break;
192 - }
193 } 157 }
194 - return buildBuyItem(element, e);
195 - }
196 -
197 - Widget buildBuyItem(ProductDetails? element, MembershipDataGoodsList e) {
198 var style = const TextStyle(color: Colors.white); 158 var style = const TextStyle(color: Colors.white);
199 var button = Text("购买", style: style).paddingLeftRight(15).paddingTopBottom(8).click(() { 159 var button = Text("购买", style: style).paddingLeftRight(15).paddingTopBottom(8).click(() {
200 showLoading(); 160 showLoading();
...@@ -211,6 +171,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -211,6 +171,7 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
211 ).paddingLeftRight(10).paddingTopBottom(5); 171 ).paddingLeftRight(10).paddingTopBottom(5);
212 } 172 }
213 173
174 + ///价格字符串,优先使用商店的本地化价格
214 String buildBuyPrice(ProductDetails? element, MembershipDataGoodsList e) { 175 String buildBuyPrice(ProductDetails? element, MembershipDataGoodsList e) {
215 if (element == null) { 176 if (element == null) {
216 return "${e.price}/${e.name}"; 177 return "${e.price}/${e.name}";
...@@ -218,13 +179,38 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO ...@@ -218,13 +179,38 @@ class MembershipPageState extends BaseState<MembershipPage> with WidgetsBindingO
218 return "${element.price}/${e.name}"; 179 return "${element.price}/${e.name}";
219 } 180 }
220 181
221 - bool mapId(String? id, int? membershipId) { 182 + ///其他入口区域
222 - bool year = id == 'yearly_yiyan_vip' && membershipId == 4; 183 + Widget initOtherEntrance() {
223 - bool month = id == 'monthly_yiyan_vip' && membershipId == 3; 184 + return Row(
224 - if (year || month) { 185 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
225 - print("$id ---- $membershipId"); 186 + mainAxisSize: MainAxisSize.min,
226 - } 187 + crossAxisAlignment: CrossAxisAlignment.center,
227 - return year || month; 188 + children: [
189 + TextButton(
190 + onPressed: () {},
191 + child: Text(
192 + "服务协议",
193 + style: TextStyle(fontSize: 14.px, color: Colors.white),
194 + ),
195 + ),
196 + Container(width: 0.6, height: 15.0, color: Colours.line),
197 + TextButton(
198 + onPressed: () {},
199 + child: Text(
200 + "隐私政策",
201 + style: TextStyle(fontSize: 14.px, color: Colors.white),
202 + ),
203 + ),
204 + Container(width: 0.6, height: 15.0, color: Colours.line),
205 + TextButton(
206 + onPressed: () {},
207 + child: Text(
208 + "恢复购买",
209 + style: TextStyle(fontSize: 14.px, color: Colors.white),
210 + ),
211 + ),
212 + ],
213 + );
228 } 214 }
229 215
230 @override 216 @override
......