property_ioan_page.dart 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. import 'package:cs_resources/generated/assets.dart';
  2. import 'package:cs_resources/generated/l10n.dart';
  3. import 'package:cs_resources/theme/app_colors_theme.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:auto_route/auto_route.dart';
  6. import 'package:flutter_hooks/flutter_hooks.dart';
  7. import 'package:hooks_riverpod/hooks_riverpod.dart';
  8. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  9. import 'package:router/ext/auto_router_extensions.dart';
  10. import 'package:shared/utils/color_utils.dart';
  11. import 'package:widgets/ext/ex_widget.dart';
  12. import 'package:widgets/load_state_layout.dart';
  13. import 'package:widgets/my_button.dart';
  14. import 'package:widgets/my_load_image.dart';
  15. import 'package:widgets/my_text_view.dart';
  16. import 'package:widgets/utils/dark_theme_util.dart';
  17. import '../../../router/page/property_page_router.dart';
  18. import 'property_ioan_vm.dart';
  19. @RoutePage()
  20. class PropertyIoanPage extends HookConsumerWidget {
  21. const PropertyIoanPage({Key? key}) : super(key: key);
  22. //启动当前页面
  23. static void startInstance({BuildContext? context}) {
  24. if (context != null) {
  25. context.router.push(const PropertyIoanPageRoute());
  26. } else {
  27. appRouter.push(const PropertyIoanPageRoute());
  28. }
  29. }
  30. Widget _buildContentTopAdviceSection(BuildContext context,WidgetRef ref, _vm){
  31. return Column(
  32. children: [
  33. MyTextView(
  34. "24IFM",
  35. textColor: DarkThemeUtil.multiColors(context, context.appColors.textBlack, darkColor: Colors.white),
  36. fontSize: 27,
  37. isFontMedium: true,
  38. textAlign: TextAlign.center,
  39. ),
  40. MyTextView(
  41. S.current.find_best_loan,
  42. textColor: DarkThemeUtil.multiColors(context, context.appColors.textBlack, darkColor: Colors.white),
  43. fontSize: 16,
  44. isFontRegular: true,
  45. marginBottom: 14,
  46. textAlign: TextAlign.center,
  47. ),
  48. Container(
  49. width: double.infinity,
  50. height: 210,
  51. decoration: BoxDecoration(
  52. borderRadius: BorderRadius.circular(0),
  53. color: DarkThemeUtil.multiColors(context, ColorUtils.string2Color('#FEFEFE'), darkColor: Colors.black),
  54. image: const DecorationImage(
  55. image: AssetImage('packages/cs_resources/${Assets.propertyHomeLoanBg}'), // 使用包中的资源
  56. fit: BoxFit.cover,
  57. ),
  58. ),
  59. child: Column(
  60. children: [
  61. MyTextView(
  62. S.current.exclusive_rates,
  63. textColor: DarkThemeUtil.multiColors(context, ColorUtils.string2Color('#FEFEFE'), darkColor: Colors.white),
  64. fontSize: 15,
  65. boxWidth: 237,
  66. boxHeight: 35,
  67. alignment: Alignment.center,
  68. textAlign: TextAlign.center,
  69. marginTop: 5.5,
  70. backgroundColor: DarkThemeUtil.multiColors(context, context.appColors.textPrimary, darkColor: Colors.black),
  71. ),
  72. Expanded(
  73. child: Row(
  74. mainAxisAlignment: MainAxisAlignment.center,
  75. children: [
  76. Container(
  77. width: 105,
  78. height: 105,
  79. padding: const EdgeInsets.all(5),
  80. color: DarkThemeUtil.multiColors(context, context.appColors.textPrimary, darkColor: Colors.black),
  81. child: Column(
  82. mainAxisAlignment: MainAxisAlignment.center,
  83. crossAxisAlignment: CrossAxisAlignment.center,
  84. children: [
  85. MyTextView(
  86. _vm.state.lowestFloatingRate,
  87. textColor: ColorUtils.string2Color('#FEFEFE'),
  88. fontSize: 30,
  89. ),
  90. MyTextView(
  91. S.current.lowest_floating_rate,
  92. textColor: ColorUtils.string2Color('#FEFEFE'),
  93. fontSize: 14,
  94. textAlign: TextAlign.center,
  95. ),
  96. ]
  97. )
  98. ),
  99. Container(
  100. width: 105,
  101. height: 105,
  102. padding: const EdgeInsets.all(5),
  103. color: DarkThemeUtil.multiColors(context, context.appColors.textPrimary, darkColor: Colors.black),
  104. margin: const EdgeInsets.only(left: 18),
  105. child: Column(
  106. mainAxisAlignment: MainAxisAlignment.center,
  107. crossAxisAlignment: CrossAxisAlignment.center,
  108. children: [
  109. MyTextView(
  110. _vm.state.lowestFixedRate,
  111. textColor: ColorUtils.string2Color('#FEFEFE'),
  112. fontSize: 30,
  113. ),
  114. MyTextView(
  115. S.current.lowest_floating_rate,
  116. textColor: ColorUtils.string2Color('#FEFEFE'),
  117. fontSize: 14,
  118. textAlign: TextAlign.center,
  119. ),
  120. ]
  121. )
  122. ),
  123. ],
  124. ),
  125. ),
  126. ],
  127. ),
  128. ),
  129. MyTextView(
  130. S.current.other_offering,
  131. textColor: ColorUtils.string2Color('#FEFEFE'),
  132. fontSize: 15,
  133. boxWidth: double.infinity,
  134. boxHeight: 40.5,
  135. alignment: Alignment.center,
  136. textAlign: TextAlign.center,
  137. backgroundColor: DarkThemeUtil.multiColors(context, context.appColors.textPrimary, darkColor: Colors.black),
  138. ),
  139. const SizedBox(height: 20),
  140. Row(
  141. mainAxisAlignment: MainAxisAlignment.start,
  142. children: [
  143. MyLoadImage(
  144. Assets.propertyAdvicePic,
  145. width: 132,
  146. // height: 122.5,
  147. ),
  148. Expanded(
  149. child: Container(
  150. // color: Colors.red,
  151. padding: const EdgeInsets.only(left: 20,right: 20),
  152. child: Column(
  153. // mainAxisAlignment: MainAxisAlignment.end,
  154. crossAxisAlignment: CrossAxisAlignment.start,
  155. children: [
  156. Row(
  157. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  158. children: [
  159. MyTextView(
  160. S.current.floating_rate,
  161. textColor: context.appColors.textBlack,
  162. fontSize: 14,
  163. textAlign: TextAlign.center,
  164. ),
  165. MyTextView(
  166. S.current.fixed_rate,
  167. textColor: context.appColors.textBlack,
  168. fontSize: 14,
  169. textAlign: TextAlign.center,
  170. ),
  171. ],
  172. ),
  173. // const SizedBox(height: 10),
  174. Expanded(child: Column(
  175. mainAxisAlignment: MainAxisAlignment.center,
  176. children: [
  177. Row(
  178. mainAxisAlignment: MainAxisAlignment.center,
  179. children: [
  180. MyTextView(
  181. "3.08%",
  182. textColor: context.appColors.textBlack,
  183. fontSize: 16,
  184. textAlign: TextAlign.center,
  185. isFontMedium: true,
  186. marginLeft: 15,
  187. ),
  188. MyTextView(
  189. "2.50%",
  190. textColor: context.appColors.textBlack,
  191. fontSize: 16,
  192. textAlign: TextAlign.center,
  193. isFontMedium: true,
  194. marginLeft: 50.5,
  195. ),
  196. ],
  197. ),
  198. Row(
  199. mainAxisAlignment: MainAxisAlignment.center,
  200. children: [
  201. MyTextView(
  202. "3.08%",
  203. textColor: context.appColors.textBlack,
  204. fontSize: 16,
  205. textAlign: TextAlign.center,
  206. isFontMedium: true,
  207. marginLeft: 15,
  208. ),
  209. MyTextView(
  210. "2.50%",
  211. textColor: context.appColors.textBlack,
  212. fontSize: 16,
  213. textAlign: TextAlign.center,
  214. isFontMedium: true,
  215. marginLeft: 50.5,
  216. ),
  217. ],
  218. ).marginOnly(top: 15),
  219. Row(
  220. mainAxisAlignment: MainAxisAlignment.center,
  221. children: [
  222. MyTextView(
  223. "3.08%",
  224. textColor: context.appColors.textBlack,
  225. fontSize: 16,
  226. textAlign: TextAlign.center,
  227. isFontMedium: true,
  228. marginLeft: 15,
  229. ),
  230. MyTextView(
  231. "2.50%",
  232. textColor: context.appColors.textBlack,
  233. fontSize: 16,
  234. textAlign: TextAlign.center,
  235. isFontMedium: true,
  236. marginLeft: 47.5,
  237. ),
  238. ],
  239. ).marginOnly(top: 15),
  240. ],
  241. ))
  242. ],
  243. ),
  244. ),
  245. ),
  246. ],
  247. ).constrained(height: 160),
  248. ],
  249. );
  250. }
  251. Widget _buildContentMiddleTextSection(BuildContext context,WidgetRef ref, _vm) {
  252. return Column(
  253. children: [
  254. MyTextView(
  255. S.current.choose_best_package,
  256. textColor: DarkThemeUtil.multiColors(context, context.appColors.textBlack, darkColor: Colors.white),
  257. fontSize: 18,
  258. isFontMedium: true,
  259. marginTop: 20,
  260. marginBottom: 20,
  261. textAlign: TextAlign.center,
  262. ),
  263. MyTextView(
  264. S.current.text_no_hidden_fees,
  265. textColor: DarkThemeUtil.multiColors(context, context.appColors.textBlack, darkColor: Colors.white),
  266. fontSize: 15,
  267. textAlign: TextAlign.center,
  268. marginBottom: 20,
  269. ),
  270. ],
  271. );
  272. }
  273. Widget _buildContentOfferSection(BuildContext context,WidgetRef ref, _vm) {
  274. final offerTextInfoList = _vm.state.offerTextInfoList.map((value) => value).toList();
  275. return Container(
  276. width: double.infinity,
  277. child: Column(
  278. children: [
  279. MyTextView(
  280. S.current.what_do_we_offer,
  281. textColor: DarkThemeUtil.multiColors(context, context.appColors.textBlack, darkColor: Colors.white),
  282. fontSize: 18,
  283. isFontMedium: true,
  284. marginTop: 16.5,
  285. marginBottom: 16.5,
  286. ),
  287. Wrap(
  288. children: List.generate(offerTextInfoList.length, (index){
  289. return Container(
  290. width: MediaQuery.of(context).size.width / 2 - 30,
  291. margin: const EdgeInsets.only(right: 15,bottom: 15),
  292. padding: const EdgeInsets.only(left: 15,right: 15,top:15,bottom:15,),
  293. // decoration: BoxDecoration(
  294. // borderRadius: BorderRadius.circular(10),
  295. // color: ColorUtils.string2Color('#F5F5F5'),
  296. // ),
  297. child: Column(
  298. children: [
  299. MyLoadImage(
  300. offerTextInfoList[index]["icon"],
  301. width: offerTextInfoList[index]["iconWidth"],
  302. height: offerTextInfoList[index]["iconHeight"],
  303. ),
  304. const SizedBox(height: 13,),
  305. MyTextView(
  306. offerTextInfoList[index]["title"],
  307. fontSize: 15,
  308. textColor: context.appColors.textBlack,
  309. textAlign: TextAlign.center,
  310. ),
  311. ]
  312. ),
  313. );
  314. }),
  315. ),
  316. ]
  317. ),
  318. );
  319. }
  320. Widget _buildContentBottomPartnersSection(BuildContext context,WidgetRef ref, _vm) {
  321. return Column(
  322. mainAxisAlignment: MainAxisAlignment.center,
  323. crossAxisAlignment: CrossAxisAlignment.center,
  324. children: [
  325. MyTextView(
  326. S.current.our_partners,
  327. textColor: context.appColors.textBlack,
  328. fontSize: 18,
  329. isFontMedium: true,
  330. marginBottom: 16.5,
  331. ),
  332. MyLoadImage(Assets.propertyOurPartners,),
  333. ],
  334. );
  335. }
  336. Widget _buildCotentBox(BuildContext context,WidgetRef ref, _vm) {
  337. return Column(
  338. children: [
  339. _buildContentTopAdviceSection(context, ref, _vm),
  340. const SizedBox(height: 15,),
  341. _buildContentMiddleTextSection(context, ref, _vm),
  342. const SizedBox(height: 15,),
  343. _buildContentOfferSection(context, ref, _vm),
  344. const SizedBox(height: 15,),
  345. _buildContentBottomPartnersSection(context, ref, _vm),
  346. ],
  347. );
  348. }
  349. @override
  350. Widget build(BuildContext context, WidgetRef ref) {
  351. final _vm = ref.read(propertyIoanVmProvider.notifier);
  352. final state = ref.watch(propertyIoanVmProvider);
  353. useEffect((){
  354. _vm.initPageData();
  355. return () {};
  356. }, []);
  357. return Scaffold(
  358. backgroundColor: DarkThemeUtil.multiColors(context, ColorUtils.string2Color("#F2F3F6"), darkColor: Colors.black),
  359. // appBar: AppBar(title: Text("资产")),
  360. body: Column(
  361. children: [
  362. Expanded(
  363. child: LoadStateLayout(
  364. state: state.loadingState,
  365. errorMessage: state.errorMessage,
  366. errorRetry: () {
  367. _vm.retryRequest();
  368. },
  369. successWidget: SingleChildScrollView(
  370. scrollDirection: Axis.vertical,
  371. physics: const BouncingScrollPhysics(),
  372. clipBehavior: Clip.none,
  373. child: Padding(
  374. padding: const EdgeInsets.only(left: 15,right: 15,top: 15),
  375. child: _buildCotentBox(context, ref, _vm),
  376. )
  377. ),
  378. )
  379. ),
  380. // Visibility(
  381. // visible: state.loadingState == LoadState.State_Success,
  382. // child: Container(
  383. // height: 50,
  384. // color: context.appColors.textPrimary,
  385. // child: Row(
  386. // mainAxisAlignment: MainAxisAlignment.center,
  387. // children: [
  388. // // MyLoadImage(Assets.propertyIoanItemBg,width: 60,height: 50,),
  389. // const SizedBox(width: 10,),
  390. // MyTextView(
  391. // "Request a Quote",
  392. // fontSize: 16,
  393. // textColor: context.appColors.textWhite,
  394. // isFontMedium: true,
  395. // ),
  396. // ],
  397. // ),
  398. // ).onTap((){
  399. // _vm.handlerRequestQuote(context);
  400. // }),
  401. // )
  402. ],
  403. ),
  404. );
  405. }
  406. }