From 0526baa3c8567988b04374bc94929a1952d6d0d7 Mon Sep 17 00:00:00 2001 From: peima Date: Sat, 1 Aug 2026 01:58:36 +0800 Subject: [PATCH] fix(runtime): 37 late fields with == null checks were wrongly migrated -> nullable. Fixes LateInitializationError crashes on page navigation (shop/checkout/comment/data pages) --- lib/pages/buy_service.dart | 10 +- lib/pages/contact_us.dart | 8 +- lib/pages/download.dart | 8 +- lib/pages/igoshow_learn_more.dart | 8 +- lib/pages/minipos_learn_more.dart | 8 +- lib/pages/plain_page.dart | 8 +- lib/pages/renew_minioffice.dart | 8 +- lib/utils/double_back_to_close_app.dart | 4 +- .../desktop/create_online_store_1.dart | 8 +- lib/widgets/desktop/desktop_new_comment.dart | 16 +- lib/widgets/desktop/desktop_pay_now.dart | 6 +- .../desktop/desktop_product_detail_page.dart | 48 +++--- .../desktop/desktop_shopping_cart_widget.dart | 6 +- lib/widgets/desktop/desktop_view_blog.dart | 12 +- lib/widgets/desktop/desktop_view_ticket.dart | 22 +-- lib/widgets/desktop/shop.dart | 10 +- lib/widgets/desktop/shopping_cart_widget.dart | 6 +- lib/widgets/general/add_remove_button.dart | 48 +++--- lib/widgets/general/carousel.dart | 4 +- .../general/parabolic_animation_widget.dart | 10 +- .../payment_verification_code_dialog.dart | 2 +- .../general/popup_animation_widget.dart | 4 +- lib/widgets/general/sliding_up_panel.dart | 28 ++-- lib/widgets/mobile/create_online_store_1.dart | 8 +- lib/widgets/mobile/mobile_checkout.dart | 72 ++++----- lib/widgets/mobile/mobile_new_comment.dart | 16 +- lib/widgets/mobile/mobile_pay_now.dart | 6 +- .../mobile/mobile_product_detail_page.dart | 38 ++--- lib/widgets/mobile/mobile_view_blog.dart | 12 +- lib/widgets/mobile/mobile_view_ticket.dart | 24 +-- lib/widgets/mobile/shop.dart | 152 +++++++++--------- lib/widgets/mobile/shopping_cart_bar.dart | 14 +- 32 files changed, 317 insertions(+), 317 deletions(-) diff --git a/lib/pages/buy_service.dart b/lib/pages/buy_service.dart index e56d77f..84b7011 100644 --- a/lib/pages/buy_service.dart +++ b/lib/pages/buy_service.dart @@ -30,7 +30,7 @@ class BuyService extends StatefulWidget { } class BuyServiceState extends State { - late Map data; + Map? data; @override Widget build(BuildContext context) { @@ -51,9 +51,9 @@ class BuyServiceState extends State { return ResponsiveBuilder( builder: (context, sizingInformation) => ScreenTypeLayout( - mobile: MobileBuyService(data), - tablet: DesktopBuyService(data), - desktop: DesktopBuyService(data), + mobile: MobileBuyService(data!), + tablet: DesktopBuyService(data!), + desktop: DesktopBuyService(data!), ), ); } @@ -73,7 +73,7 @@ class BuyServiceState extends State { } ).then((value) { data = value; - data['domain'] = widget.domain; + data!['domain'] = widget.domain; print('data: $data'); setState(() {}); }).onError((error, stackTrace) { diff --git a/lib/pages/contact_us.dart b/lib/pages/contact_us.dart index 0e06bf2..9b969e5 100644 --- a/lib/pages/contact_us.dart +++ b/lib/pages/contact_us.dart @@ -22,7 +22,7 @@ class ContactUs extends StatefulWidget { } class ContactUsState extends State { - late Business business; + Business? business; @override Widget build(BuildContext context) { @@ -43,9 +43,9 @@ class ContactUsState extends State { return ResponsiveBuilder( builder: (context, sizingInformation) => ScreenTypeLayout( - mobile: MobileContactUs(business), - tablet: DesktopContactUs(business), - desktop: DesktopContactUs(business), + mobile: MobileContactUs(business!), + tablet: DesktopContactUs(business!), + desktop: DesktopContactUs(business!), ), ); } diff --git a/lib/pages/download.dart b/lib/pages/download.dart index 6f0c1a7..1a3d9f0 100644 --- a/lib/pages/download.dart +++ b/lib/pages/download.dart @@ -30,7 +30,7 @@ class Download extends StatefulWidget { class DownloadState extends State { final _scaffoldKey = GlobalKey(); - late Map data; + Map? data; @override Widget build(BuildContext context) { @@ -58,11 +58,11 @@ class DownloadState extends State { ), drawer: sizingInformation.deviceScreenType == DeviceScreenType.mobile ? MobileNavigationDrawer() : null, body: ScreenTypeLayout( - mobile: MobileDownloadApps(data), - tablet: DesktopDownloadApps(data), + mobile: MobileDownloadApps(data!), + tablet: DesktopDownloadApps(data!), desktop: Scrollbar( thumbVisibility: true, - child: DesktopDownloadApps(data), + child: DesktopDownloadApps(data!), ), ), bottomNavigationBar: ScreenTypeLayout( diff --git a/lib/pages/igoshow_learn_more.dart b/lib/pages/igoshow_learn_more.dart index e283add..ac13f26 100644 --- a/lib/pages/igoshow_learn_more.dart +++ b/lib/pages/igoshow_learn_more.dart @@ -26,7 +26,7 @@ class IGoShowLearnMore extends StatefulWidget { class IGoShowLearnMoreState extends State { final _scaffoldKey = GlobalKey(); - late Map data; + Map? data; @override Widget build(BuildContext context) { @@ -56,9 +56,9 @@ class IGoShowLearnMoreState extends State { ), drawer: null, body: ScreenTypeLayout( - mobile: MobileiGoShowLearnMore(data), - tablet: DesktopiGoShowLearnMore(data), - desktop: DesktopiGoShowLearnMore(data), + mobile: MobileiGoShowLearnMore(data!), + tablet: DesktopiGoShowLearnMore(data!), + desktop: DesktopiGoShowLearnMore(data!), ), bottomNavigationBar: ScreenTypeLayout( mobile: MobileBottomNav(currentIndex: 0,), diff --git a/lib/pages/minipos_learn_more.dart b/lib/pages/minipos_learn_more.dart index 9ca8a01..1d69b77 100644 --- a/lib/pages/minipos_learn_more.dart +++ b/lib/pages/minipos_learn_more.dart @@ -26,7 +26,7 @@ class MiniPosLearnMore extends StatefulWidget { class MiniPosLearnMoreState extends State { final _scaffoldKey = GlobalKey(); - late Map data; + Map? data; @override Widget build(BuildContext context) { @@ -57,9 +57,9 @@ class MiniPosLearnMoreState extends State { ), drawer: null, body: ScreenTypeLayout( - mobile: MobileMiniPosLearnMore(data), - tablet: DesktopMiniPosLearnMore(data), - desktop: DesktopMiniPosLearnMore(data), + mobile: MobileMiniPosLearnMore(data!), + tablet: DesktopMiniPosLearnMore(data!), + desktop: DesktopMiniPosLearnMore(data!), ), bottomNavigationBar: ScreenTypeLayout( mobile: MobileBottomNav(currentIndex: 0,), diff --git a/lib/pages/plain_page.dart b/lib/pages/plain_page.dart index ca1ace8..af63629 100644 --- a/lib/pages/plain_page.dart +++ b/lib/pages/plain_page.dart @@ -23,7 +23,7 @@ class PlainPage extends StatefulWidget { } class PlainPageState extends State { - late Blog blog; + Blog? blog; @override Widget build(BuildContext context) { @@ -44,9 +44,9 @@ class PlainPageState extends State { return ResponsiveBuilder( builder: (context, sizingInformation) => ScreenTypeLayout( - mobile: MobilePlainPage(blog), - tablet: DesktopPlainPage(blog), - desktop: DesktopPlainPage(blog), + mobile: MobilePlainPage(blog!), + tablet: DesktopPlainPage(blog!), + desktop: DesktopPlainPage(blog!), ), ); } diff --git a/lib/pages/renew_minioffice.dart b/lib/pages/renew_minioffice.dart index 93ee0b2..25caa4b 100644 --- a/lib/pages/renew_minioffice.dart +++ b/lib/pages/renew_minioffice.dart @@ -25,7 +25,7 @@ class RenewMiniOffice extends StatefulWidget { } class RenewMiniOfficeState extends State { - late Map data; + Map? data; @override Widget build(BuildContext context) { @@ -46,9 +46,9 @@ class RenewMiniOfficeState extends State { return ResponsiveBuilder( builder: (context, sizingInformation) => ScreenTypeLayout( - mobile: MobileRenewMiniOffice(data), - tablet: DesktopRenewMiniOffice(data), - desktop: DesktopRenewMiniOffice(data), + mobile: MobileRenewMiniOffice(data!), + tablet: DesktopRenewMiniOffice(data!), + desktop: DesktopRenewMiniOffice(data!), ), ); } diff --git a/lib/utils/double_back_to_close_app.dart b/lib/utils/double_back_to_close_app.dart index 50e9e2d..9d2923b 100644 --- a/lib/utils/double_back_to_close_app.dart +++ b/lib/utils/double_back_to_close_app.dart @@ -34,7 +34,7 @@ class DoubleBackToCloseApp extends StatefulWidget { class _DoubleBackToCloseAppState extends State { /// The last time the user tapped Android's back-button. - late DateTime _lastTimeBackButtonWasTapped; + DateTime? _lastTimeBackButtonWasTapped; /// Returns whether the current platform is Android. bool get _isAndroid => Theme.of(context).platform == TargetPlatform.android; @@ -50,7 +50,7 @@ class _DoubleBackToCloseAppState extends State { bool get _isSnackBarVisible => (_lastTimeBackButtonWasTapped != null) && (widget.snackBar.duration > - DateTime.now().difference(_lastTimeBackButtonWasTapped)); + DateTime.now().difference(_lastTimeBackButtonWasTapped!)); /// Returns whether the next back navigation of this route will be handled /// internally. diff --git a/lib/widgets/desktop/create_online_store_1.dart b/lib/widgets/desktop/create_online_store_1.dart index 528f1a1..5b621d0 100644 --- a/lib/widgets/desktop/create_online_store_1.dart +++ b/lib/widgets/desktop/create_online_store_1.dart @@ -35,7 +35,7 @@ class CreateOnlineStore1State extends State { bool canSubmit = false; List stores = []; - late Map service; + Map? service; dynamic selectedStore; late Group group; @@ -322,7 +322,7 @@ class CreateOnlineStore1State extends State { Container( padding: EdgeInsets.only(top: 8.0), child: Text( - service['description'], + service!['description'], ), ), ); @@ -330,7 +330,7 @@ class CreateOnlineStore1State extends State { Container( padding: EdgeInsets.only(top: 8.0), child: Text( - service['options'][0]['name'], + service!['options'][0]['name'], ), ), ); @@ -338,7 +338,7 @@ class CreateOnlineStore1State extends State { Container( padding: EdgeInsets.only(top: 8.0), child: Text( - '\$${service['options'][0]['price']}', + '\$${service!['options'][0]['price']}', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, diff --git a/lib/widgets/desktop/desktop_new_comment.dart b/lib/widgets/desktop/desktop_new_comment.dart index ce1bd90..57caac1 100644 --- a/lib/widgets/desktop/desktop_new_comment.dart +++ b/lib/widgets/desktop/desktop_new_comment.dart @@ -34,7 +34,7 @@ class DesktopNewComment extends StatefulWidget { } class DesktopNewCommentState extends State { - late Comment comment; + Comment? comment; late bool _showProgress; @@ -203,8 +203,8 @@ class DesktopNewCommentState extends State { children: [], ); - if (comment != null && comment.images!.length > 0) { - for (ProductImage image in comment.images!) { + if (comment != null && comment!.images!.length > 0) { + for (ProductImage image in comment!.images!) { row.children.add( Container( padding: EdgeInsets.only(left: 10.0), @@ -275,7 +275,7 @@ class DesktopNewCommentState extends State { child: Icon( Icons.add, size: 60.0, - color: comment == null || comment.images!.length < 3 ? Colors.lightBlue : Colors.black12, + color: comment == null || comment!.images!.length < 3 ? Colors.lightBlue : Colors.black12, ), decoration: BoxDecoration( color: Colors.white70, @@ -300,13 +300,13 @@ class DesktopNewCommentState extends State { ), ), onTap: () { - if (comment == null || comment.images!.length < 3) { + if (comment == null || comment!.images!.length < 3) { showDialog( context: mainContext, barrierDismissible: true, builder: (BuildContext context) { return Util().getPicture(mainContext, store.state.user!, - commentId: comment != null ? comment.id! : 0, + commentId: comment != null ? comment!.id! : 0, orderId: widget.orderId); } ); @@ -365,7 +365,7 @@ class DesktopNewCommentState extends State { } }, queryParameters: { - 'comment_id': comment != null ? comment.id! : 0, + 'comment_id': comment != null ? comment!.id! : 0, }, ).catchError((error) { Utils.showMessageDialog(context, error); @@ -392,7 +392,7 @@ class DesktopNewCommentState extends State { isFormData: true, body: { 'order_id': widget.orderId, - 'comment_id': comment != null ? comment.id! : 0, + 'comment_id': comment != null ? comment!.id! : 0, 'content': commentController.text, 'rating': rating.round(), }, diff --git a/lib/widgets/desktop/desktop_pay_now.dart b/lib/widgets/desktop/desktop_pay_now.dart index 01b44a3..ef7a489 100644 --- a/lib/widgets/desktop/desktop_pay_now.dart +++ b/lib/widgets/desktop/desktop_pay_now.dart @@ -32,7 +32,7 @@ class DesktopPayNow extends StatefulWidget { } class DesktopPayNowState extends State { - late Order order; + Order? order; late List paymentPlatforms; late User _user; @@ -86,7 +86,7 @@ class DesktopPayNowState extends State { ), ), Text( - '\$${order.totalPrice!.toStringAsFixed(2)}', + '\$${order!.totalPrice!.toStringAsFixed(2)}', style: TextStyle( fontSize: 24.0, fontWeight: FontWeight.bold, @@ -206,7 +206,7 @@ class DesktopPayNowState extends State { ), ), onTap: () { - Util.goPayment(context, order, paymentPlatform); + Util.goPayment(context, order!, paymentPlatform); }, ); } diff --git a/lib/widgets/desktop/desktop_product_detail_page.dart b/lib/widgets/desktop/desktop_product_detail_page.dart index b2e8538..790abfe 100644 --- a/lib/widgets/desktop/desktop_product_detail_page.dart +++ b/lib/widgets/desktop/desktop_product_detail_page.dart @@ -46,7 +46,7 @@ class DesktopProductDetailPageState extends State final double _tabBarHeight = 50; - late ProductDetail productDetail; + ProductDetail? productDetail; late bool refresh; @@ -83,7 +83,7 @@ class DesktopProductDetailPageState extends State title: S.of(context).shop, back: true, breadCrumbs: [ - BreadCrumb(productDetail.name!, null), + BreadCrumb(productDetail!.name!, null), ], breadCrumbHeight: Constants.BREADCRUMB_HEIGHT, // shoppingCart: DesktopShoppingCartWidget(business: widget.business,), @@ -114,7 +114,7 @@ class DesktopProductDetailPageState extends State Container( margin: EdgeInsets.only(top: 10), child: Text( - 'SKU: ${productDetail.sku}', + 'SKU: ${productDetail!.sku}', overflow: TextOverflow.ellipsis, maxLines: 2, style: TextStyle( @@ -125,7 +125,7 @@ class DesktopProductDetailPageState extends State ), Container( child: Text( - productDetail.name!, + productDetail!.name!, overflow: TextOverflow.ellipsis, maxLines: 2, style: TextStyle( @@ -137,7 +137,7 @@ class DesktopProductDetailPageState extends State Container( padding: EdgeInsets.only(top: 10, bottom: 20), child: Text( - '${productDetail.description}', + '${productDetail!.description}', overflow: TextOverflow.ellipsis, maxLines: 3, style: TextStyle( @@ -163,12 +163,12 @@ class DesktopProductDetailPageState extends State crossAxisAlignment: CrossAxisAlignment.start, children: [ ShowPrice( - productDetail.price!, + productDetail!.price!, currencySign: '\$', fontWeight: FontWeight.bold, smallFontSize: 24, largeFontSize: 40, - regularPrice: productDetail.regularPrice, + regularPrice: productDetail!.regularPrice, ), AddRemoveButton( product: widget.product, @@ -207,35 +207,35 @@ class DesktopProductDetailPageState extends State mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - (productDetail.subproducts!.length > 0) ? - subProducts(productDetail.subproducts!) : + (productDetail!.subproducts!.length > 0) ? + subProducts(productDetail!.subproducts!) : SizedBox.shrink(), Container( padding: EdgeInsets.only( top: 10.0, left: 10.0, right: 10.0, bottom: 16.0), child: Text( - productDetail.description!, + productDetail!.description!, style: TextStyle( fontSize: 14.0, color: Colors.black54), ), ), Container( padding: EdgeInsets.only(left: 10.0, right: 10.0), - child: (productDetail.description2 != null && - !productDetail.description2!.isEmpty) + child: (productDetail!.description2 != null && + !productDetail!.description2!.isEmpty) ? Text( - '${productDetail.description2}', + '${productDetail!.description2}', style: TextStyle( fontSize: 14.0, color: Colors.black54), ) : SizedBox.shrink(), ), - productDetail.detailDescription != null + productDetail!.detailDescription != null ? Container( padding: EdgeInsets.only(left: 10.0, right: 10.0), child: MarkdownBody( - data: '${productDetail.detailDescription}', + data: '${productDetail!.detailDescription}', shrinkWrap: true, ), ) @@ -253,7 +253,7 @@ class DesktopProductDetailPageState extends State children: [ Container( child: Text( - S.of(context).weight_token(productDetail.weight!), + S.of(context).weight_token(productDetail!.weight!), style: TextStyle( fontSize: 12.0, color: Colors.black54, @@ -263,9 +263,9 @@ class DesktopProductDetailPageState extends State Container( child: Text( S.of(context).dimentions_token( - productDetail.dimentionsLength!, - productDetail.dimentionsWidth!, - productDetail.dimentionsHeight!), + productDetail!.dimentionsLength!, + productDetail!.dimentionsWidth!, + productDetail!.dimentionsHeight!), style: TextStyle( fontSize: 12.0, color: Colors.black54, @@ -299,9 +299,9 @@ class DesktopProductDetailPageState extends State } Widget getImage(double width) { - if (productDetail.images!.length <= 0) { + if (productDetail!.images!.length <= 0) { return Util.showImage( - productDetail.image!, + productDetail!.image!, width: width, height: width, ); @@ -452,10 +452,10 @@ class DesktopProductDetailPageState extends State List _getProductPictures(BuildContext context) { var pages = []; List images = []; - images.add(productDetail.image!); - for (var i = 0; i < productDetail.images!.length; i++) { + images.add(productDetail!.image!); + for (var i = 0; i < productDetail!.images!.length; i++) { // print('>>https:' + productDetail.images[i].image); - images.add(productDetail.images![i].image!); + images.add(productDetail!.images![i].image!); } for (var i = 0; i < images.length; i++) { diff --git a/lib/widgets/desktop/desktop_shopping_cart_widget.dart b/lib/widgets/desktop/desktop_shopping_cart_widget.dart index 7faa8be..3ba5179 100644 --- a/lib/widgets/desktop/desktop_shopping_cart_widget.dart +++ b/lib/widgets/desktop/desktop_shopping_cart_widget.dart @@ -18,15 +18,15 @@ class DesktopShoppingCartWidget extends StatefulWidget { } class DesktopShoppingCartWidgetState extends State { - late CartInfo cartInfo; + CartInfo? cartInfo; double totalPrice = 0.0; @override Widget build(BuildContext context) { totalPrice = 0.0; cartInfo = Utils.getCartInfoByBusiness(store.state.cartInfos, widget.business)!; - if (cartInfo != null && cartInfo.businessInfo!.id == widget.business.id) { - totalPrice = cartInfo.getTotalPrice(); + if (cartInfo != null && cartInfo!.businessInfo!.id == widget.business.id) { + totalPrice = cartInfo!.getTotalPrice(); } Row row = Row( mainAxisAlignment: MainAxisAlignment.end, diff --git a/lib/widgets/desktop/desktop_view_blog.dart b/lib/widgets/desktop/desktop_view_blog.dart index f02c8a5..07bd0df 100644 --- a/lib/widgets/desktop/desktop_view_blog.dart +++ b/lib/widgets/desktop/desktop_view_blog.dart @@ -28,7 +28,7 @@ class DesktopViewBlog extends StatefulWidget { } class DesktopViewBlogState extends State { - late Blog blog; + Blog? blog; double sideSpace = 0; double mainSpace = 1200; @@ -97,7 +97,7 @@ class DesktopViewBlogState extends State { children: [ Expanded( child: Text( - '${blog.title}', + '${blog!.title}', style: TextStyle( fontSize: 24.0, color: Colors.black @@ -105,7 +105,7 @@ class DesktopViewBlogState extends State { ), ), Text( - Utils.utcDatetimeStringToLocalDatetimeString(context, blog.createdAt!), + Utils.utcDatetimeStringToLocalDatetimeString(context, blog!.createdAt!), style: TextStyle( fontSize: 14.0, color: Colors.black38, @@ -119,7 +119,7 @@ class DesktopViewBlogState extends State { padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0, bottom: 24.0), child: Container( child: Text( - '${blog.body}', + '${blog!.body}', style: TextStyle( color: Colors.black87, fontSize: 17.0, @@ -169,12 +169,12 @@ class DesktopViewBlogState extends State { width: mainSpace / 2, margin: EdgeInsets.only(top: 16.0, bottom: 16.0), padding: EdgeInsets.all(10.0), - child: (blog.imageUrl == null) ? + child: (blog!.imageUrl == null) ? SizedBox.shrink() : Container( width: mainSpace / 2 - 100.0, height: mainSpace / 2 - 100.0, - child: Util.showImage('https:${blog.imageUrl}'), + child: Util.showImage('https:${blog!.imageUrl}'), ), ), ], diff --git a/lib/widgets/desktop/desktop_view_ticket.dart b/lib/widgets/desktop/desktop_view_ticket.dart index cca9a34..7de3a04 100644 --- a/lib/widgets/desktop/desktop_view_ticket.dart +++ b/lib/widgets/desktop/desktop_view_ticket.dart @@ -33,7 +33,7 @@ class DesktopViewTicket extends StatefulWidget { class DesktopViewTicketState extends State { final GlobalKey _formKey = GlobalKey(); - late Ticket ticket; + Ticket? ticket; final issueMsgController = TextEditingController(); @@ -220,14 +220,14 @@ class DesktopViewTicketState extends State { crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( - S.of(context).ticket_number_token(ticket.id!), + S.of(context).ticket_number_token(ticket!.id!), style: TextStyle( fontSize: 24.0, color: Colors.black ), ), Text( - Utils.utcDatetimeStringToLocalDatetimeString(context, ticket.createdAt!), + Utils.utcDatetimeStringToLocalDatetimeString(context, ticket!.createdAt!), style: TextStyle( fontSize: 14.0, color: Colors.black38, @@ -240,7 +240,7 @@ class DesktopViewTicketState extends State { width: double.maxFinite, padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0, bottom: 24.0), child: Text( - '${ticket.issue!.msg}', + '${ticket!.issue!.msg}', style: TextStyle( color: Colors.black54, fontSize: 14.0, @@ -260,7 +260,7 @@ class DesktopViewTicketState extends State { padding: EdgeInsets.only(top: 16.0, bottom: 16.0, left: 16.0, right: 16.0), child: SingleChildScrollView( scrollDirection: Axis.horizontal, - child: showGalleryImages(mainContext, ticket.issue!.files!), + child: showGalleryImages(mainContext, ticket!.issue!.files!), ), decoration: BoxDecoration( border: Border( @@ -291,7 +291,7 @@ class DesktopViewTicketState extends State { ], ); - if (ticket.followUps!.length > 0) { + if (ticket!.followUps!.length > 0) { ticketCol.children.add( Container( width: double.maxFinite, @@ -305,8 +305,8 @@ class DesktopViewTicketState extends State { ), ), ); - for (int i = 0; i < ticket.followUps!.length; i++) { - FollowUp followUp = ticket.followUps![i]; + for (int i = 0; i < ticket!.followUps!.length; i++) { + FollowUp followUp = ticket!.followUps![i]; ticketCol.children.add( Container( width: double.maxFinite, @@ -406,7 +406,7 @@ class DesktopViewTicketState extends State { width: mainSpace / 2, margin: EdgeInsets.only(top: 16.0, bottom: 16.0), padding: EdgeInsets.all(10.0), - child: (ticket.isClosed == true) ? + child: (ticket!.isClosed == true) ? Column( children: [ Container( @@ -423,7 +423,7 @@ class DesktopViewTicketState extends State { padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 0.0, bottom: 30.0), child: TextLink( S.of(context).new_ticket, - '/new-ticket/${ticket.store!.id}', + '/new-ticket/${ticket!.store!.id}', ), ) ], @@ -692,7 +692,7 @@ class DesktopViewTicketState extends State { child: Text(S.of(context).ok), onPressed: () { Routes.router.navigateTo(context, - '/my-support/${ticket.store!.id}', + '/my-support/${ticket!.store!.id}', replace: true, ); }, diff --git a/lib/widgets/desktop/shop.dart b/lib/widgets/desktop/shop.dart index eb16352..313c080 100644 --- a/lib/widgets/desktop/shop.dart +++ b/lib/widgets/desktop/shop.dart @@ -32,7 +32,7 @@ class Shop extends StatefulWidget { } class ShopState extends State { - late Business _business; + Business? _business; PanelController panelController = PanelController(); late SlidingUpPanel _slidUpShoppingCart; @@ -71,7 +71,7 @@ class ShopState extends State { backdropEnabled: true, slideDirection: SlideDirection.DOWN, panel: ShoppingCartBar( - business: _business, + business: _business!, endKey: endKey, barAtBottom: true, hasPicture: true, @@ -119,14 +119,14 @@ class ShopState extends State { onTap: () { Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) { - return ProductSearch(_business); + return ProductSearch(_business!); })); }, ), ], breadCrumbHeight: Constants.BREADCRUMB_HEIGHT, shoppingCart: ShoppingCartWidget( - business: _business, + business: _business!, onTap: () { if (panelController.isPanelClosed) { panelController.open(); @@ -150,7 +150,7 @@ class ShopState extends State { mainAxisSize: MainAxisSize.min, children: [ ShopPromote(data), - ShopBulletin(_business), + ShopBulletin(_business!), ShopProducts(data), ], ), diff --git a/lib/widgets/desktop/shopping_cart_widget.dart b/lib/widgets/desktop/shopping_cart_widget.dart index d2b67d3..353ed96 100644 --- a/lib/widgets/desktop/shopping_cart_widget.dart +++ b/lib/widgets/desktop/shopping_cart_widget.dart @@ -19,15 +19,15 @@ class ShoppingCartWidget extends StatefulWidget { } class ShoppingCartWidgetState extends State { - late CartInfo cartInfo; + CartInfo? cartInfo; double totalPrice = 0.0; @override Widget build(BuildContext context) { totalPrice = 0.0; cartInfo = Utils.getCartInfoByBusiness(store.state.cartInfos, widget.business)!; - if (cartInfo != null && cartInfo.businessInfo!.id == widget.business.id) { - totalPrice = cartInfo.getTotalPrice(); + if (cartInfo != null && cartInfo!.businessInfo!.id == widget.business.id) { + totalPrice = cartInfo!.getTotalPrice(); } Row row = Row( mainAxisAlignment: MainAxisAlignment.end, diff --git a/lib/widgets/general/add_remove_button.dart b/lib/widgets/general/add_remove_button.dart index 7d37664..7b42241 100644 --- a/lib/widgets/general/add_remove_button.dart +++ b/lib/widgets/general/add_remove_button.dart @@ -48,7 +48,7 @@ class AddRemoveButtonState extends State { var d = 1; - late CartInfo cartInfo; + CartInfo? cartInfo; GlobalKey startKey = GlobalKey(); @@ -63,10 +63,10 @@ class AddRemoveButtonState extends State { _qty = 0; cartInfo = Utils.getCartInfoByBusiness(store.state.cartInfos, widget.business!)!; if (cartInfo != null) { - for (var i = 0; i < cartInfo.productList!.length; i++) { - if (cartInfo.productList![i].product!.id == widget.product!.id - && cartInfo.productList![i].unitPrice == 0.0) { - _qty = cartInfo.productList![i].quantity!.round(); + for (var i = 0; i < cartInfo!.productList!.length; i++) { + if (cartInfo!.productList![i].product!.id == widget.product!.id + && cartInfo!.productList![i].unitPrice == 0.0) { + _qty = cartInfo!.productList![i].quantity!.round(); break; } } @@ -104,9 +104,9 @@ class AddRemoveButtonState extends State { _qty = 0; cartInfo = Utils.getCartInfoByBusiness(store.state.cartInfos, widget.business!)!; if (cartInfo != null) { - for (var i = 0; i < cartInfo.productList!.length; i++) { - if (cartInfo.productList![i].product!.id == widget.product!.id) { - _qty = cartInfo.productList![i].quantity!.round(); + for (var i = 0; i < cartInfo!.productList!.length; i++) { + if (cartInfo!.productList![i].product!.id == widget.product!.id) { + _qty = cartInfo!.productList![i].quantity!.round(); break; } } @@ -196,9 +196,9 @@ class AddRemoveButtonState extends State { _qty = 0; cartInfo = Utils.getCartInfoByBusiness(store.state.cartInfos, widget.business!)!; if (cartInfo != null) { - for (var i = 0; i < cartInfo.productList!.length; i++) { - if (cartInfo.productList![i].product!.id == widget.product!.id) { - _qty = cartInfo.productList![i].quantity!.round(); + for (var i = 0; i < cartInfo!.productList!.length; i++) { + if (cartInfo!.productList![i].product!.id == widget.product!.id) { + _qty = cartInfo!.productList![i].quantity!.round(); break; } } @@ -311,7 +311,7 @@ class AddRemoveButtonState extends State { void _addToCart(BuildContext context) { if (widget.cartLineItemIndex != -1) { - if (cartInfo.productList![widget.cartLineItemIndex].quantity! + 1.0 > widget.product!.leftNum!) { + if (cartInfo!.productList![widget.cartLineItemIndex].quantity! + 1.0 > widget.product!.leftNum!) { Fluttertoast.showToast( msg: S.of(context).product_insufficient, toastLength: Toast.LENGTH_SHORT, @@ -320,10 +320,10 @@ class AddRemoveButtonState extends State { textColor: Colors.white ); } else { - cartInfo.productList![widget.cartLineItemIndex].quantity = (cartInfo.productList![widget.cartLineItemIndex].quantity ?? 0) + 1.0; - Utils.addSubproductQty(cartInfo, cartInfo.productList![widget.cartLineItemIndex]); + cartInfo!.productList![widget.cartLineItemIndex].quantity = (cartInfo!.productList![widget.cartLineItemIndex].quantity ?? 0) + 1.0; + Utils.addSubproductQty(cartInfo!, cartInfo!.productList![widget.cartLineItemIndex]); store.dispatch(UpdateCartInfo( - Utils.addCartInfoToCartInfoList(store.state.cartInfos, cartInfo))); + Utils.addCartInfoToCartInfoList(store.state.cartInfos, cartInfo!))); eventBus.fire(new OnCartInfoUpdated()); } } else { @@ -344,7 +344,7 @@ class AddRemoveButtonState extends State { void _removeFromCart(BuildContext context) { if (widget.cartLineItemIndex != -1) { - if (cartInfo.productList![widget.cartLineItemIndex].quantity! <= 1) { + if (cartInfo!.productList![widget.cartLineItemIndex].quantity! <= 1) { showDialog( context: context, builder: (BuildContext context) { @@ -379,18 +379,18 @@ class AddRemoveButtonState extends State { } void _removeCartLineItem() { - if (cartInfo.productList![widget.cartLineItemIndex].quantity! <= 1) { - String uuid = cartInfo.productList![widget.cartLineItemIndex].uuid!; - cartInfo.productList!.removeAt(widget.cartLineItemIndex); - Utils.removeSubproduct(cartInfo, uuid); + if (cartInfo!.productList![widget.cartLineItemIndex].quantity! <= 1) { + String uuid = cartInfo!.productList![widget.cartLineItemIndex].uuid!; + cartInfo!.productList!.removeAt(widget.cartLineItemIndex); + Utils.removeSubproduct(cartInfo!, uuid); } else { - cartInfo.productList![widget.cartLineItemIndex].quantity = (cartInfo.productList![widget.cartLineItemIndex].quantity ?? 0) - 1; - Utils.addSubproductQty(cartInfo, cartInfo.productList![widget.cartLineItemIndex], remove: true); + cartInfo!.productList![widget.cartLineItemIndex].quantity = (cartInfo!.productList![widget.cartLineItemIndex].quantity ?? 0) - 1; + Utils.addSubproductQty(cartInfo!, cartInfo!.productList![widget.cartLineItemIndex], remove: true); } - if (cartInfo.productList!.length <= 0) { + if (cartInfo!.productList!.length <= 0) { store.dispatch(new UpdateCartInfo(Utils.removeCartInfoFromCartInfoList(store.state.cartInfos, cartInfo))); } else { - store.dispatch(new UpdateCartInfo(Utils.addCartInfoToCartInfoList(store.state.cartInfos, cartInfo))); + store.dispatch(new UpdateCartInfo(Utils.addCartInfoToCartInfoList(store.state.cartInfos, cartInfo!))); } eventBus.fire(new OnCartInfoUpdated()); } diff --git a/lib/widgets/general/carousel.dart b/lib/widgets/general/carousel.dart index 9244404..055efa7 100644 --- a/lib/widgets/general/carousel.dart +++ b/lib/widgets/general/carousel.dart @@ -30,7 +30,7 @@ class Carousel extends StatefulWidget { class CarouselState extends State { final _pageController = new PageController(); - late Timer _timer; + Timer? _timer; int _currentPage = 0; bool reverse = false; GlobalKey _indicatorStateKey = new GlobalKey(); @@ -63,7 +63,7 @@ class CarouselState extends State { void dispose() { _pageController?.dispose(); if (_timer != null) { - _timer.cancel(); + _timer!.cancel(); } super.dispose(); } diff --git a/lib/widgets/general/parabolic_animation_widget.dart b/lib/widgets/general/parabolic_animation_widget.dart index 3916874..4d4feaa 100644 --- a/lib/widgets/general/parabolic_animation_widget.dart +++ b/lib/widgets/general/parabolic_animation_widget.dart @@ -22,7 +22,7 @@ class ParabolicAnimationWidget extends AnimatedWidget { this.endAdjustOffset = Offset.zero, }) : super(listenable: animation); - late Offset _startOffset; + Offset? _startOffset; late Offset _endOffset; @override @@ -36,13 +36,13 @@ class ParabolicAnimationWidget extends AnimatedWidget { // double x(double time) => _x + _v * time + 0.5 * _a * time * time; final double initV = -400; //纵坐标初速度, 负值为向上抛 final double acceleration = - (_endOffset.dy - _startOffset.dy - initV) / 0.5; //求纵坐标加速度 + (_endOffset.dy - _startOffset!.dy - initV) / 0.5; //求纵坐标加速度 final GravitySimulation spy = GravitySimulation( - acceleration, _startOffset.dy, _endOffset.dy, initV); //y轴加速度运动 模拟 + acceleration, _startOffset!.dy, _endOffset.dy, initV); //y轴加速度运动 模拟 - final GravitySimulation spx = GravitySimulation(0, _startOffset.dx, - _endOffset.dx, _endOffset.dx - _startOffset.dx); //x轴匀速模拟 加速度为0 + final GravitySimulation spx = GravitySimulation(0, _startOffset!.dx, + _endOffset.dx, _endOffset.dx - _startOffset!.dx); //x轴匀速模拟 加速度为0 final Animation opacity = Tween(begin: 1, end: 0).animate( CurvedAnimation( diff --git a/lib/widgets/general/payment_verification_code_dialog.dart b/lib/widgets/general/payment_verification_code_dialog.dart index 78a51c8..a39bbc1 100644 --- a/lib/widgets/general/payment_verification_code_dialog.dart +++ b/lib/widgets/general/payment_verification_code_dialog.dart @@ -33,7 +33,7 @@ class PaymentVerificationCodeDialogState extends State with SingleTickerProvid class PanelController{ - late _SlidingUpPanelState _panelState; + _SlidingUpPanelState? _panelState; void _addState(_SlidingUpPanelState panelState){ this._panelState = panelState; @@ -616,27 +616,27 @@ class PanelController{ /// Closes the sliding panel to its collapsed state (i.e. to the minHeight) Future close(){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._close(); + return _panelState!._close(); } /// Opens the sliding panel fully /// (i.e. to the maxHeight) Future open(){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._open(); + return _panelState!._open(); } /// Hides the sliding panel (i.e. is invisible) Future hide(){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._hide(); + return _panelState!._hide(); } /// Shows the sliding panel in its collapsed state /// (i.e. "un-hide" the sliding panel) Future show(){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._show(); + return _panelState!._show(); } /// Animates the panel position to the value. @@ -647,7 +647,7 @@ class PanelController{ Future animatePanelToPosition(double value, {Duration? duration, Curve curve = Curves.linear}){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); assert(0.0 <= value && value <= 1.0); - return _panelState._animatePanelToPosition(value, duration: duration, curve: curve); + return _panelState!._animatePanelToPosition(value, duration: duration, curve: curve); } /// Animates the panel position to the snap point @@ -656,8 +656,8 @@ class PanelController{ /// (optional) curve specifies the easing behavior of the animation. Future animatePanelToSnapPoint({Duration? duration, Curve curve = Curves.linear}){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - assert(_panelState.widget.snapPoint != null, "SlidingUpPanel snapPoint property must not be null"); - return _panelState._animatePanelToSnapPoint(duration: duration, curve: curve); + assert(_panelState!.widget.snapPoint != null, "SlidingUpPanel snapPoint property must not be null"); + return _panelState!._animatePanelToSnapPoint(duration: duration, curve: curve); } /// Sets the panel position (without animation). @@ -666,7 +666,7 @@ class PanelController{ set panelPosition(double value){ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); assert(0.0 <= value && value <= 1.0); - _panelState._panelPosition = value; + _panelState!._panelPosition = value; } /// Gets the current panel position. @@ -677,35 +677,35 @@ class PanelController{ /// 1.0 is full open. double get panelPosition{ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._panelPosition; + return _panelState!._panelPosition; } /// Returns whether or not the panel is /// currently animating. bool get isPanelAnimating{ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._isPanelAnimating; + return _panelState!._isPanelAnimating; } /// Returns whether or not the /// panel is open. bool get isPanelOpen{ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._isPanelOpen; + return _panelState!._isPanelOpen; } /// Returns whether or not the /// panel is closed. bool get isPanelClosed{ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._isPanelClosed; + return _panelState!._isPanelClosed; } /// Returns whether or not the /// panel is shown/hidden. bool get isPanelShown{ assert(isAttached, "PanelController must be attached to a SlidingUpPanel"); - return _panelState._isPanelShown; + return _panelState!._isPanelShown; } } \ No newline at end of file diff --git a/lib/widgets/mobile/create_online_store_1.dart b/lib/widgets/mobile/create_online_store_1.dart index 8e48c11..7932b0c 100644 --- a/lib/widgets/mobile/create_online_store_1.dart +++ b/lib/widgets/mobile/create_online_store_1.dart @@ -30,7 +30,7 @@ class CreateOnlineStore1State extends State { bool canSubmit = false; List stores = []; - late Map service; + Map? service; dynamic selectedStore; late Group group; @@ -269,7 +269,7 @@ class CreateOnlineStore1State extends State { Container( padding: EdgeInsets.only(top: 8.0), child: Text( - service['description'], + service!['description'], ), ), ); @@ -277,7 +277,7 @@ class CreateOnlineStore1State extends State { Container( padding: EdgeInsets.only(top: 8.0), child: Text( - service['options'][0]['name'], + service!['options'][0]['name'], ), ), ); @@ -285,7 +285,7 @@ class CreateOnlineStore1State extends State { Container( padding: EdgeInsets.only(top: 8.0), child: Text( - '\$${service['options'][0]['price']}', + '\$${service!['options'][0]['price']}', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, diff --git a/lib/widgets/mobile/mobile_checkout.dart b/lib/widgets/mobile/mobile_checkout.dart index 1df72e6..6e0dfa0 100644 --- a/lib/widgets/mobile/mobile_checkout.dart +++ b/lib/widgets/mobile/mobile_checkout.dart @@ -45,7 +45,7 @@ class MobileCheckout extends StatefulWidget { } class MobileCheckoutState extends State with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin { - late CartInfo cartInfo; + CartInfo? cartInfo; Address? shipAddress; late bool canSubmit; late List errorMessages; @@ -53,7 +53,7 @@ class MobileCheckoutState extends State with SingleTickerProvide late List bookingDateTimeList; late List paymentPlatforms; TextValue? durationInTraffic; - late int selectedCoupon; + int? selectedCoupon; double couponDiscountAmount = 0; late List coupons; @@ -79,7 +79,7 @@ class MobileCheckoutState extends State with SingleTickerProvide GlobalKey slidingUpPanelKey = GlobalKey(); late SlidingUpPanel slidingUpPanel; PanelController panelController = PanelController(); - late Widget panel; + Widget? panel; late double subtotal; @@ -102,7 +102,7 @@ class MobileCheckoutState extends State with SingleTickerProvide ); } - if (cartInfo.businessInfo!.deliveryPickup == false && cartInfo.businessInfo!.deliveryCanadaPost == false && cartInfo.businessInfo!.deliveryStoreDelivery == false) { + if (cartInfo!.businessInfo!.deliveryPickup == false && cartInfo!.businessInfo!.deliveryCanadaPost == false && cartInfo!.businessInfo!.deliveryStoreDelivery == false) { return Scaffold( body: Container( child: Center( @@ -197,13 +197,13 @@ class MobileCheckoutState extends State with SingleTickerProvide mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - '\$${(cartInfo.totalPrice! - couponDiscountAmount).toStringAsFixed(2)}', + '\$${(cartInfo!.totalPrice! - couponDiscountAmount).toStringAsFixed(2)}', style: TextStyle( fontSize: 20.0, color: Colors.white, ), ), - cartInfo.businessInfo!.isPublic == true ? SizedBox.shrink() : Container( + cartInfo!.businessInfo!.isPublic == true ? SizedBox.shrink() : Container( padding: EdgeInsets.only(top: 2.0, bottom: 2.0, left: 5.0, right: 5.0), width: 100.0, color: Colors.red, @@ -267,7 +267,7 @@ class MobileCheckoutState extends State with SingleTickerProvide itemCount: 6, addAutomaticKeepAlives: true, itemBuilder: (BuildContext context, int position) { - var deliveryTimeInSeconds = cartInfo.businessInfo!.shippingTime! * 60 + (durationInTraffic != null ? durationInTraffic!.value ?? 0 : 0); + var deliveryTimeInSeconds = cartInfo!.businessInfo!.shippingTime! * 60 + (durationInTraffic != null ? durationInTraffic!.value ?? 0 : 0); print('aaa: $deliveryTimeInSeconds'); DateTime now = DateTime.now(); var formatter = DateFormat('H:mm'); @@ -341,7 +341,7 @@ class MobileCheckoutState extends State with SingleTickerProvide ); switch (position) { case 0: - if (cartInfo.businessInfo!.deliveryPickup == true) { + if (cartInfo!.businessInfo!.deliveryPickup == true) { return Container( padding: EdgeInsets.only( top: 16.0, bottom: 16.0, left: 16.0, right: 16.0), @@ -389,7 +389,7 @@ class MobileCheckoutState extends State with SingleTickerProvide Container( margin: EdgeInsets.only(top: 10.0), child: Text( - cartInfo.businessInfo!.name!, + cartInfo!.businessInfo!.name!, style: TextStyle( fontSize: 17.0, ), @@ -398,7 +398,7 @@ class MobileCheckoutState extends State with SingleTickerProvide Container( margin: EdgeInsets.only(top: 5.0), child: Text( - cartInfo.businessInfo!.address!.addressLine1!, + cartInfo!.businessInfo!.address!.addressLine1!, style: TextStyle( fontSize: 14.0, color: Colors.black45, @@ -406,9 +406,9 @@ class MobileCheckoutState extends State with SingleTickerProvide ), ), Container( - child: cartInfo.businessInfo!.address!.addressLine2 != null - && cartInfo.businessInfo!.address!.addressLine2!.length > 0 ? - Text(cartInfo.businessInfo!.address!.addressLine2!, + child: cartInfo!.businessInfo!.address!.addressLine2 != null + && cartInfo!.businessInfo!.address!.addressLine2!.length > 0 ? + Text(cartInfo!.businessInfo!.address!.addressLine2!, style: TextStyle( fontSize: 14.0, color: Colors.black45, @@ -417,7 +417,7 @@ class MobileCheckoutState extends State with SingleTickerProvide ), Container( child: Text( - '${cartInfo.businessInfo!.address!.city}, ${cartInfo.businessInfo!.address!.state}, ${cartInfo.businessInfo!.address!.zip}', + '${cartInfo!.businessInfo!.address!.city}, ${cartInfo!.businessInfo!.address!.state}, ${cartInfo!.businessInfo!.address!.zip}', style: TextStyle( fontSize: 14.0, color: Colors.black45, @@ -427,7 +427,7 @@ class MobileCheckoutState extends State with SingleTickerProvide Container( margin: EdgeInsets.only(top: 5.0), child: Text( - 'Tel: ${cartInfo.businessInfo!.phone}', + 'Tel: ${cartInfo!.businessInfo!.phone}', style: TextStyle( fontSize: 15.0, color: Colors.black54, @@ -504,7 +504,7 @@ class MobileCheckoutState extends State with SingleTickerProvide ), ), onTap: () { - Routes.router.navigateTo(context, '/my-addresses/${cartInfo.businessInfo!.id}', replace: true); + Routes.router.navigateTo(context, '/my-addresses/${cartInfo!.businessInfo!.id}', replace: true); }, ); break; @@ -583,7 +583,7 @@ class MobileCheckoutState extends State with SingleTickerProvide }, ); } - if (cartInfo.businessInfo!.instanceDelivery != true) { + if (cartInfo!.businessInfo!.instanceDelivery != true) { return Container( padding: EdgeInsets.only(left: 16.0, right: 16.0, top: 0.0, bottom: 16.0), child: Text(S.of(context).no_instance_delivery_desc), @@ -712,7 +712,7 @@ class MobileCheckoutState extends State with SingleTickerProvide width: double.infinity, padding: EdgeInsets.only(bottom: 10.0), child: Text( - cartInfo.businessInfo!.name!, + cartInfo!.businessInfo!.name!, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 16.0, @@ -731,9 +731,9 @@ class MobileCheckoutState extends State with SingleTickerProvide subtotal = 0.0; - for (var i = 0; i < cartInfo.productList!.length; i++) { - subtotal += cartInfo.productList![i].totalPrice!; - column.children.add(lineItem(cartInfo.productList![i])); + for (var i = 0; i < cartInfo!.productList!.length; i++) { + subtotal += cartInfo!.productList![i].totalPrice!; + column.children.add(lineItem(cartInfo!.productList![i])); } column.children.add(GestureDetector( child: Container( @@ -826,8 +826,8 @@ class MobileCheckoutState extends State with SingleTickerProvide ), )); - if (cartInfo.extraFeeList!.length > 0) { - for (var i = 0; i < cartInfo.extraFeeList!.length; i++) { + if (cartInfo!.extraFeeList!.length > 0) { + for (var i = 0; i < cartInfo!.extraFeeList!.length; i++) { column.children.add(Container( padding: EdgeInsets.only(bottom: 16.0), alignment: Alignment.centerRight, @@ -838,7 +838,7 @@ class MobileCheckoutState extends State with SingleTickerProvide Container( alignment: Alignment.centerRight, child: Text( - S.of(context).extra_fee_token(cartInfo.extraFeeList![i].name!, cartInfo.extraFeeList![i].rate!), + S.of(context).extra_fee_token(cartInfo!.extraFeeList![i].name!, cartInfo!.extraFeeList![i].rate!), style: TextStyle( color: Colors.grey, ), @@ -848,7 +848,7 @@ class MobileCheckoutState extends State with SingleTickerProvide width: 100.0, alignment: Alignment.centerRight, child: Text( - '${cartInfo.extraFeeList![i].price!.toStringAsFixed(2)}' + '${cartInfo!.extraFeeList![i].price!.toStringAsFixed(2)}' ), ), ], @@ -876,7 +876,7 @@ class MobileCheckoutState extends State with SingleTickerProvide width: 100.0, alignment: Alignment.centerRight, child: Text( - '${(cartInfo.totalPrice! - couponDiscountAmount).toStringAsFixed(2)}', + '${(cartInfo!.totalPrice! - couponDiscountAmount).toStringAsFixed(2)}', style: TextStyle( fontSize: 19.0, fontWeight: FontWeight.bold, @@ -1074,7 +1074,7 @@ class MobileCheckoutState extends State with SingleTickerProvide shippingRates = (response.data['shipping_rates'] as List).map((e) => ShippingRate.fromJson(e)).toList(); selectedShippingRate = (response.data['selected_shipping_rate'] as String).length > 0 ? ShippingRate.fromJson(json.decode(response.data['selected_shipping_rate'])) : null; int i = 0; - if (cartInfo.businessInfo!.deliveryStoreDelivery == true) { + if (cartInfo!.businessInfo!.deliveryStoreDelivery == true) { shippingMethodLabels.add(S.of(context).delivery); shippingMethodIcons.add(Icons.directions_car); if (deliveryMethod == 'store-delivery') { @@ -1082,7 +1082,7 @@ class MobileCheckoutState extends State with SingleTickerProvide } i++; } - if (cartInfo.businessInfo!.deliveryCanadaPost == true) { + if (cartInfo!.businessInfo!.deliveryCanadaPost == true) { shippingMethodLabels.add(S.of(context).canada_post); shippingMethodIcons.add(Icons.local_shipping); if (deliveryMethod == 'canada-post') { @@ -1090,7 +1090,7 @@ class MobileCheckoutState extends State with SingleTickerProvide } i++; } - if (cartInfo.businessInfo!.deliveryPickup == true) { + if (cartInfo!.businessInfo!.deliveryPickup == true) { shippingMethodLabels.add(S.of(context).pickup); shippingMethodIcons.add(Icons.store); if (deliveryMethod == 'pickup') { @@ -1681,7 +1681,7 @@ class MobileCheckoutState extends State with SingleTickerProvide return GestureDetector( child: Container( decoration: selectedCoupon == 0 ? BoxDecoration( - color: subtotal > cartInfo.businessInfo!.minPrice! ? Colors + color: subtotal > cartInfo!.businessInfo!.minPrice! ? Colors .transparent : Colors.black38, border: Border( top: BorderSide( @@ -1702,7 +1702,7 @@ class MobileCheckoutState extends State with SingleTickerProvide ), ), ) : BoxDecoration( - color: subtotal > cartInfo.businessInfo!.minPrice! ? Colors + color: subtotal > cartInfo!.businessInfo!.minPrice! ? Colors .transparent : Colors.black38, ), child: Row( @@ -1743,7 +1743,7 @@ class MobileCheckoutState extends State with SingleTickerProvide return GestureDetector( child: Container( decoration: selectedCoupon == coupon.id ? BoxDecoration( - color: subtotal > cartInfo.businessInfo!.minPrice! ? Colors + color: subtotal > cartInfo!.businessInfo!.minPrice! ? Colors .transparent : Colors.black38, border: Border( top: BorderSide( @@ -1917,7 +1917,7 @@ class MobileCheckoutState extends State with SingleTickerProvide crossAxisAlignment: CrossAxisAlignment.start, children: [], ); - if (cartInfo.businessInfo!.quickInputs!.length > 0) { + if (cartInfo!.businessInfo!.quickInputs!.length > 0) { Wrap w = Wrap( children: [], ); @@ -1931,8 +1931,8 @@ class MobileCheckoutState extends State with SingleTickerProvide ), ), )); - for (int i = 0; i < cartInfo.businessInfo!.quickInputs!.length; i++) { - String qi = cartInfo.businessInfo!.quickInputs![i].value!; + for (int i = 0; i < cartInfo!.businessInfo!.quickInputs!.length; i++) { + String qi = cartInfo!.businessInfo!.quickInputs![i].value!; w.children.add(TextButton( child: Text( qi, @@ -2196,7 +2196,7 @@ class MobileCheckoutState extends State with SingleTickerProvide }, businessId: widget.businessId, body: { - 'cart_id': cartInfo.id, + 'cart_id': cartInfo!.id, 'remark': orderRemark, 'booked_at': bookingTimeList.length > 0 ? bookingTimeList[bookingTimeIndex].unixTime diff --git a/lib/widgets/mobile/mobile_new_comment.dart b/lib/widgets/mobile/mobile_new_comment.dart index 553c407..0e7ef0e 100644 --- a/lib/widgets/mobile/mobile_new_comment.dart +++ b/lib/widgets/mobile/mobile_new_comment.dart @@ -31,7 +31,7 @@ class MobileNewComment extends StatefulWidget { } class MobileNewCommentState extends State { - late Comment comment; + Comment? comment; late bool _showProgress; @@ -167,8 +167,8 @@ class MobileNewCommentState extends State { children: [], ); - if (comment != null && comment.images!.length > 0) { - for (ProductImage image in comment.images!) { + if (comment != null && comment!.images!.length > 0) { + for (ProductImage image in comment!.images!) { row.children.add( Container( padding: EdgeInsets.only(left: 10.0), @@ -239,7 +239,7 @@ class MobileNewCommentState extends State { child: Icon( Icons.add, size: 60.0, - color: comment == null || comment.images!.length < 3 ? Colors.lightBlue : Colors.black12, + color: comment == null || comment!.images!.length < 3 ? Colors.lightBlue : Colors.black12, ), decoration: BoxDecoration( color: Colors.white70, @@ -264,13 +264,13 @@ class MobileNewCommentState extends State { ), ), onTap: () { - if (comment == null || comment.images!.length < 3) { + if (comment == null || comment!.images!.length < 3) { showDialog( context: mainContext, barrierDismissible: true, builder: (BuildContext context) { return Util().getPicture(mainContext, store.state.user!, - commentId: comment != null ? comment.id! : 0, + commentId: comment != null ? comment!.id! : 0, orderId: widget.orderId); } ); @@ -329,7 +329,7 @@ class MobileNewCommentState extends State { } }, queryParameters: { - 'comment_id': comment != null ? comment.id! : 0, + 'comment_id': comment != null ? comment!.id! : 0, }, ).catchError((error) { Utils.showMessageDialog(context, error); @@ -356,7 +356,7 @@ class MobileNewCommentState extends State { isFormData: true, body: { 'order_id': widget.orderId, - 'comment_id': comment != null ? comment.id! : 0, + 'comment_id': comment != null ? comment!.id! : 0, 'content': commentController.text, 'rating': rating.round(), }, diff --git a/lib/widgets/mobile/mobile_pay_now.dart b/lib/widgets/mobile/mobile_pay_now.dart index ed043f4..fd396da 100644 --- a/lib/widgets/mobile/mobile_pay_now.dart +++ b/lib/widgets/mobile/mobile_pay_now.dart @@ -30,7 +30,7 @@ class MobilePayNow extends StatefulWidget { } class MobilePayNowState extends State { - late Order order; + Order? order; late List paymentPlatforms; late User _user; @@ -74,7 +74,7 @@ class MobilePayNowState extends State { ), ), Text( - '\$${order.totalPrice!.toStringAsFixed(2)}', + '\$${order!.totalPrice!.toStringAsFixed(2)}', style: TextStyle( fontSize: 24.0, fontWeight: FontWeight.bold, @@ -194,7 +194,7 @@ class MobilePayNowState extends State { ), ), onTap: () { - Util.goPayment(context, order, paymentPlatform); + Util.goPayment(context, order!, paymentPlatform); }, ); } diff --git a/lib/widgets/mobile/mobile_product_detail_page.dart b/lib/widgets/mobile/mobile_product_detail_page.dart index 00e9ae5..605900f 100644 --- a/lib/widgets/mobile/mobile_product_detail_page.dart +++ b/lib/widgets/mobile/mobile_product_detail_page.dart @@ -53,7 +53,7 @@ class MobileProductDetailPageState extends State late double _sliverAppBarMaxHeight; final double _tabBarHeight = 50; - late ProductDetail productDetail; + ProductDetail? productDetail; late bool refresh; @@ -133,7 +133,7 @@ class MobileProductDetailPageState extends State padding: EdgeInsets.only(left: 10.0, top: 5.0, right: 10.0), child: Text( - productDetail.name!, + productDetail!.name!, style: TextStyle( fontSize: 15.0, fontWeight: FontWeight.bold), maxLines: 1, @@ -144,12 +144,12 @@ class MobileProductDetailPageState extends State mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ShowPrice( - productDetail.price!, + productDetail!.price!, currencySign: '\$', fontWeight: FontWeight.bold, smallFontSize: 14, largeFontSize: 18, - regularPrice: productDetail.regularPrice, + regularPrice: productDetail!.regularPrice, ), Container( child: AddRemoveButton( @@ -204,35 +204,35 @@ class MobileProductDetailPageState extends State mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ - (productDetail.subproducts!.length > 0) ? - subProducts(productDetail.subproducts!) : + (productDetail!.subproducts!.length > 0) ? + subProducts(productDetail!.subproducts!) : SizedBox.shrink(), Container( padding: EdgeInsets.only( top: 10.0, left: 10.0, right: 10.0), child: Text( - productDetail.description!, + productDetail!.description!, style: TextStyle( fontSize: 14.0, color: Colors.black54), ), ), Container( padding: EdgeInsets.only(left: 10.0, right: 10.0), - child: (productDetail.description2 != null && - !productDetail.description2!.isEmpty) + child: (productDetail!.description2 != null && + !productDetail!.description2!.isEmpty) ? Text( - '${productDetail.description2}', + '${productDetail!.description2}', style: TextStyle( fontSize: 14.0, color: Colors.black54), ) : SizedBox.shrink(), ), - productDetail.detailDescription != null + productDetail!.detailDescription != null ? Container( padding: EdgeInsets.only(left: 10.0, right: 10.0), child: MarkdownBody( - data: '${productDetail.detailDescription}', + data: '${productDetail!.detailDescription}', shrinkWrap: true, ), ) @@ -250,7 +250,7 @@ class MobileProductDetailPageState extends State children: [ Container( child: Text( - S.of(context).weight_token(productDetail.weight!), + S.of(context).weight_token(productDetail!.weight!), style: TextStyle( fontSize: 12.0, color: Colors.black54, @@ -260,9 +260,9 @@ class MobileProductDetailPageState extends State Container( child: Text( S.of(context).dimentions_token( - productDetail.dimentionsLength!, - productDetail.dimentionsWidth!, - productDetail.dimentionsHeight!), + productDetail!.dimentionsLength!, + productDetail!.dimentionsWidth!, + productDetail!.dimentionsHeight!), style: TextStyle( fontSize: 12.0, color: Colors.black54, @@ -418,10 +418,10 @@ class MobileProductDetailPageState extends State List _getProductPictures(BuildContext context) { var pages = []; List images = []; - images.add(productDetail.image!); - for (var i = 0; i < productDetail.images!.length; i++) { + images.add(productDetail!.image!); + for (var i = 0; i < productDetail!.images!.length; i++) { // print('>>https:' + productDetail.images[i].image); - images.add(productDetail.images![i].image!); + images.add(productDetail!.images![i].image!); } for (var i = 0; i < images.length; i++) { diff --git a/lib/widgets/mobile/mobile_view_blog.dart b/lib/widgets/mobile/mobile_view_blog.dart index 124819d..48f95b3 100644 --- a/lib/widgets/mobile/mobile_view_blog.dart +++ b/lib/widgets/mobile/mobile_view_blog.dart @@ -28,7 +28,7 @@ class MobileViewBlog extends StatefulWidget { } class MobileViewBlogState extends State { - late Blog blog; + Blog? blog; @override void initState() { @@ -85,7 +85,7 @@ class MobileViewBlogState extends State { children: [ Expanded( child: Text( - '${blog.title}', + '${blog!.title}', style: TextStyle( fontSize: 24.0, color: Colors.black @@ -93,7 +93,7 @@ class MobileViewBlogState extends State { ), ), Text( - Utils.utcDatetimeStringToLocalDatetimeString(context, blog.createdAt!), + Utils.utcDatetimeStringToLocalDatetimeString(context, blog!.createdAt!), style: TextStyle( fontSize: 14.0, color: Colors.black38, @@ -106,7 +106,7 @@ class MobileViewBlogState extends State { width: double.maxFinite, padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0, bottom: 24.0), child: Text( - '${blog.body}', + '${blog!.body}', style: TextStyle( color: Colors.black87, fontSize: 17.0, @@ -124,11 +124,11 @@ class MobileViewBlogState extends State { Container( width: double.maxFinite, padding: EdgeInsets.only(top: 16.0, bottom: 16.0, left: 16.0, right: 16.0), - child: (blog.imageUrl != null) ? + child: (blog!.imageUrl != null) ? Container( width: min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) - 100.0, height: min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) - 100.0, - child: Util.showImage('https:${blog.imageUrl}'), + child: Util.showImage('https:${blog!.imageUrl}'), ) : SizedBox.shrink(), decoration: BoxDecoration( border: Border( diff --git a/lib/widgets/mobile/mobile_view_ticket.dart b/lib/widgets/mobile/mobile_view_ticket.dart index 1e5fe8c..e89fe21 100644 --- a/lib/widgets/mobile/mobile_view_ticket.dart +++ b/lib/widgets/mobile/mobile_view_ticket.dart @@ -34,7 +34,7 @@ class MobileViewTicket extends StatefulWidget { class MobileViewTicketState extends State { final GlobalKey _formKey = GlobalKey(); - late Ticket ticket; + Ticket? ticket; final issueMsgController = TextEditingController(); @@ -103,14 +103,14 @@ class MobileViewTicketState extends State { crossAxisAlignment: CrossAxisAlignment.end, children: [ Text( - S.of(context).ticket_number_token(ticket.id!), + S.of(context).ticket_number_token(ticket!.id!), style: TextStyle( fontSize: 24.0, color: Colors.black ), ), Text( - Utils.utcDatetimeStringToLocalDatetimeString(context, ticket.createdAt!), + Utils.utcDatetimeStringToLocalDatetimeString(context, ticket!.createdAt!), style: TextStyle( fontSize: 14.0, color: Colors.black38, @@ -123,7 +123,7 @@ class MobileViewTicketState extends State { width: double.maxFinite, padding: EdgeInsets.only(top: 8.0, left: 16.0, right: 16.0, bottom: 24.0), child: Text( - '${ticket.issue!.msg}', + '${ticket!.issue!.msg}', style: TextStyle( color: Colors.black54, fontSize: 14.0, @@ -141,7 +141,7 @@ class MobileViewTicketState extends State { Container( width: double.maxFinite, padding: EdgeInsets.only(top: 16.0, bottom: 16.0, left: 16.0, right: 16.0), - child: showGalleryImages(mainContext, ticket.issue!.files!), + child: showGalleryImages(mainContext, ticket!.issue!.files!), decoration: BoxDecoration( border: Border( bottom: BorderSide( @@ -171,7 +171,7 @@ class MobileViewTicketState extends State { ], ); - if (ticket.followUps!.length > 0) { + if (ticket!.followUps!.length > 0) { view.children.add( Container( width: double.maxFinite, @@ -185,8 +185,8 @@ class MobileViewTicketState extends State { ), ), ); - for (int i = 0; i < ticket.followUps!.length; i++) { - FollowUp followUp = ticket.followUps![i]; + for (int i = 0; i < ticket!.followUps!.length; i++) { + FollowUp followUp = ticket!.followUps![i]; view.children.add( Container( width: double.maxFinite, @@ -353,7 +353,7 @@ class MobileViewTicketState extends State { ), ); - if (ticket.followUps!.length > 0) { + if (ticket!.followUps!.length > 0) { view.children.add( Container( width: double.maxFinite, @@ -375,7 +375,7 @@ class MobileViewTicketState extends State { ); } - if (ticket.isClosed == true) { + if (ticket!.isClosed == true) { view.children.add( Container( padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0), @@ -393,7 +393,7 @@ class MobileViewTicketState extends State { padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 0.0, bottom: 30.0), child: TextLink( S.of(context).new_ticket, - '/new-ticket/${ticket.store!.id}', + '/new-ticket/${ticket!.store!.id}', ), ), ); @@ -689,7 +689,7 @@ class MobileViewTicketState extends State { child: Text(S.of(context).ok), onPressed: () { Routes.router.navigateTo(context, - '/my-support/${ticket.store!.id}', + '/my-support/${ticket!.store!.id}', replace: true, ); }, diff --git a/lib/widgets/mobile/shop.dart b/lib/widgets/mobile/shop.dart index 1240685..9c72e3a 100644 --- a/lib/widgets/mobile/shop.dart +++ b/lib/widgets/mobile/shop.dart @@ -56,8 +56,8 @@ class ShopState extends State GlobalKey _scaffoldKey = new GlobalKey(); - late Business _business; - late List _categoryProducts; + Business? _business; + List? _categoryProducts; late List _featuredProducts; late List _hotSaleProducts; @@ -86,7 +86,7 @@ class ShopState extends State final double _tabBarHeight = 50.0; late double _sliverAppBarMaxHeight; - late ShopScrollController _listScrollController1; + ShopScrollController? _listScrollController1; late ShopScrollController _listScrollController2; late ShopScrollController _listScrollController3; @@ -94,7 +94,7 @@ class ShopState extends State GlobalKey stackKey = GlobalKey(); GlobalKey endKey = GlobalKey(); - late List comments; + List? comments; int _commentPage = 1; int _commentPageCount = 1; bool _commentLoadingFinish = false; @@ -140,7 +140,7 @@ class ShopState extends State 'page': _commentPage.toString(), 'size': Constants.ORDERS_PER_PAGE.toString(), }, - businessId: _business.id!, + businessId: _business!.id!, ).then((data) { if (isRefresh) { _commentRefreshController.refreshCompleted(); @@ -226,7 +226,7 @@ class ShopState extends State isDraggable: true, backdropEnabled: true, panel: ShoppingCartBar( - business: _business, + business: _business!, endKey: endKey, onEmptyCartListener: () { Future.delayed(Duration(seconds: 1), () { @@ -247,7 +247,7 @@ class ShopState extends State mainAxisAlignment: MainAxisAlignment.start, children: [], ); - for (var i = 0; i < _business.promoProducts!.length; i++) { + for (var i = 0; i < _business!.promoProducts!.length; i++) { promotRow.children.add(Container( padding: EdgeInsets.only( left: 10.0, @@ -286,17 +286,17 @@ class ShopState extends State GestureDetector( child: Container( child: Util.showImage( - _business.promoProducts![i].imagePath!, + _business!.promoProducts![i].imagePath!, width: 110.0, ), ), onTap: () { - _showProductDetail(_business.promoProducts![i]); + _showProductDetail(_business!.promoProducts![i]); }, ), Container( child: Text( - _business.promoProducts![i].name!, + _business!.promoProducts![i].name!, maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 14.0), @@ -306,13 +306,13 @@ class ShopState extends State mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ShowPrice( - _business.promoProducts![i].price!, + _business!.promoProducts![i].price!, currencySign: '\$', - regularPrice: _business.promoProducts![i].regularPrice, + regularPrice: _business!.promoProducts![i].regularPrice, ), Container( child: AddRemoveButton( - product: _business.promoProducts![i], + product: _business!.promoProducts![i], business: _business, addOnly: true, ), @@ -392,7 +392,7 @@ class ShopState extends State onTap: () { Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) { - return ProductSearch(_business); + return ProductSearch(_business!); })); }, ), @@ -403,13 +403,13 @@ class ShopState extends State child: new Icon(Icons.phone), onTap: () { Utils.launchURL( - 'tel:${Utils.getFirstNumberFromString(_business.phone!)}'); + 'tel:${Utils.getFirstNumberFromString(_business!.phone!)}'); }, ), ), ], title: Text( - _business != null ? _business.name! : '', + _business != null ? _business!.name! : '', style: TextStyle( color: Colors.white, ), @@ -446,7 +446,7 @@ class ShopState extends State Tab( child: Badge( badgeContent: Text( - '${_business.commentsCount}', + '${_business!.commentsCount}', style: TextStyle(color: Colors.white, fontSize: 11.0), ), badgeStyle: BadgeStyle(badgeColor: Colors.lightBlueAccent), @@ -508,7 +508,7 @@ class ShopState extends State stack.children.addAll(children); - if (_business.isPublic != true) { + if (_business!.isPublic != true) { stack.children.add( Positioned( top: 0, @@ -571,12 +571,12 @@ class ShopState extends State Widget commentWidget = Center( child: Text(S.of(context).no_comments_yet), ); - if (comments != null && comments.length > 0) { + if (comments != null && comments!.length > 0) { commentWidget = ListView.builder( controller: _listScrollController3, - itemCount: comments.length, + itemCount: comments!.length, itemBuilder: (BuildContext context, int position) { - Comment comment = comments[position]; + Comment comment = comments![position]; Row imageRow = Row( mainAxisAlignment: MainAxisAlignment.start, children: [], @@ -772,18 +772,18 @@ class ShopState extends State children: [], ); addressColumn.children.add(new Text( - _business.address!.addressLine1! + - (_business.address!.addressLine2!.isNotEmpty - ? ' ' + _business.address!.addressLine2! + _business!.address!.addressLine1! + + (_business!.address!.addressLine2!.isNotEmpty + ? ' ' + _business!.address!.addressLine2! : ''), style: new TextStyle(fontSize: 13.0, color: const Color(0xFFEEEEEE)), )); addressColumn.children.add(new Text( - _business.address!.city! + + _business!.address!.city! + ', ' + - _business.address!.state! + + _business!.address!.state! + ', ' + - _business.address!.zip!, + _business!.address!.zip!, style: new TextStyle(fontSize: 13.0, color: const Color(0xFFEEEEEE)), )); @@ -793,23 +793,23 @@ class ShopState extends State crossAxisAlignment: CrossAxisAlignment.center, children: [], ); - if (_business.distanceInfo != null) { + if (_business!.distanceInfo != null) { distanceRow.children.add(new Icon( Icons.directions_car, size: 14.0, color: Colors.white, )); distanceRow.children.add(new Text( - _business.distanceInfo!.distance != null - ? _business.distanceInfo!.distance!.text! + _business!.distanceInfo!.distance != null + ? _business!.distanceInfo!.distance!.text! : '***' + ' / ', style: new TextStyle(color: const Color(0xFFEEEEEE), fontSize: 13.0), )); var duration = Duration( - seconds: (_business.distanceInfo!.duration != null - ? _business.distanceInfo!.duration!.value + seconds: (_business!.distanceInfo!.duration != null + ? _business!.distanceInfo!.duration!.value : 30)! + - _business.shippingTime! * 60); + _business!.shippingTime! * 60); var hours = duration.inHours.remainder(60); var minutes = duration.inMinutes.remainder(60); distanceRow.children.add(new Text( @@ -825,7 +825,7 @@ class ShopState extends State distanceRow.children.add( new Text( ' / ' + - S.of(context).min_order_amount_token(_business.minPrice!) + + S.of(context).min_order_amount_token(_business!.minPrice!) + ' ', style: new TextStyle(fontSize: 13.0, color: const Color(0xFFEEEEEE)), ), @@ -853,7 +853,7 @@ class ShopState extends State bottom: 0.0, child: GestureDetector( child: Util.showImage( - '${_business.picUrl}', + '${_business!.picUrl}', width: 72.0, height: 72.0, fit: BoxFit.fill, @@ -895,7 +895,7 @@ class ShopState extends State color: Colors.white, ), new Text( - _business.phone!, + _business!.phone!, style: new TextStyle( fontSize: 13.0, color: const Color(0xFFEEEEEE)), ) @@ -910,9 +910,9 @@ class ShopState extends State color: Colors.white, ), new Text( - _business.openingTime![0].openTime! + + _business!.openingTime![0].openTime! + ':00 - ' + - _business.openingTime![0].closeTime! + + _business!.openingTime![0].closeTime! + ':00', style: new TextStyle( fontSize: 13.0, color: const Color(0xFFEEEEEE)), @@ -941,7 +941,7 @@ class ShopState extends State mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - _business.bulletin!.isNotEmpty ? Row( + _business!.bulletin!.isNotEmpty ? Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( @@ -956,7 +956,7 @@ class ShopState extends State width: mediaQuery.size.width - 30.0, padding: EdgeInsets.only(right: 10.0, bottom: 10.0), child: new Text( - _business.bulletin!.isEmpty ? '' : _business.bulletin!, + _business!.bulletin!.isEmpty ? '' : _business!.bulletin!, softWrap: true, style: new TextStyle( fontSize: 12.0, color: const Color(0xFFDDDDDD)), @@ -965,7 +965,7 @@ class ShopState extends State ), ], ) : SizedBox.shrink(), - _business.description!.isNotEmpty ? Column( + _business!.description!.isNotEmpty ? Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -996,7 +996,7 @@ class ShopState extends State padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 5.0), child: Text( - _business.description!, + _business!.description!, style: TextStyle( color: Colors.lightGreen, fontSize: 12.0, @@ -1009,7 +1009,7 @@ class ShopState extends State padding: EdgeInsets.only(left: 10.0, right: 10.0, bottom: 10.0), child: slidingGellery, ) : SizedBox.shrink(), - _business.policy!.isNotEmpty ? Column( + _business!.policy!.isNotEmpty ? Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -1040,7 +1040,7 @@ class ShopState extends State padding: EdgeInsets.only(left: 10.0, right: 10.0, bottom: 10.0), child: SingleChildScrollView( child: Text( - _business.policy!, + _business!.policy!, softWrap: true, style: TextStyle( fontSize: 10.0, @@ -1062,7 +1062,7 @@ class ShopState extends State right: 0, bottom: 0, child: Util.showImage( - _business.bannerImageUrl!, + _business!.bannerImageUrl!, fit: BoxFit.cover, ), ), @@ -1098,11 +1098,11 @@ class ShopState extends State List _buildBanners(BuildContext context) { var pages = []; - for (var i = 0; i < _business.slideImages!.length; i++) { + for (var i = 0; i < _business!.slideImages!.length; i++) { pages.add(new GestureDetector( child: new Container( child: Util.showImage( - _business.slideImages![i].imageUrl!, + _business!.slideImages![i].imageUrl!, fit: BoxFit.cover, ), ), @@ -1132,14 +1132,14 @@ class ShopState extends State child: new ListView.builder( physics: ClampingScrollPhysics(), controller: _listScrollController2, - itemCount: _categoryProducts == null ? 0 : _categoryProducts.length, + itemCount: _categoryProducts == null ? 0 : _categoryProducts!.length, itemBuilder: (BuildContext context, int i) { - CategoryProducts cp = _categoryProducts[i]; + CategoryProducts cp = _categoryProducts![i]; int qtyInCategory = 0; CartInfo cartInfo = - Utils.getCartInfoByBusiness(store.state.cartInfos, _business)!; + Utils.getCartInfoByBusiness(store.state.cartInfos, _business!)!; if (cartInfo != null && - cartInfo.businessInfo!.id == _business.id && + cartInfo.businessInfo!.id == _business!.id && cartInfo.productList != null) { for (var i = 0; i < cartInfo.productList!.length; i++) { if (cartInfo.productList![i].product!.categoryId == cp.id) { @@ -1213,21 +1213,21 @@ class ShopState extends State } void _selectCategory(int index) { - if (displayProductByCategoryClick && _categoryProducts[index].id! > 0) { - categoryId = _categoryProducts[index].id!; + if (displayProductByCategoryClick && _categoryProducts![index].id! > 0) { + categoryId = _categoryProducts![index].id!; loadProducts(); return; } double height = 0.0; for (int i = 0; i < index; ++i) { height += _categoryDescHeight + - _categoryProducts[i].products!.length * _productHeight; + _categoryProducts![i].products!.length * _productHeight; } - if (height > _listScrollController1.position.maxScrollExtent) { - height = _listScrollController1.position.maxScrollExtent; + if (height > _listScrollController1!.position.maxScrollExtent) { + height = _listScrollController1!.position.maxScrollExtent; } _categoryIndexChange = true; - _listScrollController1 + _listScrollController1! .animateTo(height, duration: new Duration( microseconds: 200, @@ -1237,7 +1237,7 @@ class ShopState extends State _categoryIndexChange = false; }); print( - 'height: $height, index: $index, ${_categoryProducts[0].products!.length}'); + 'height: $height, index: $index, ${_categoryProducts![0].products!.length}'); if (mounted) { setState(() { _categoryIndex = index; @@ -1246,7 +1246,7 @@ class ShopState extends State } CategoryProducts? getCategoryProductByCategoryId(int cid) { - for (CategoryProducts cp in _categoryProducts) { + for (CategoryProducts cp in _categoryProducts!) { if (cp.id == cid) { return cp; } @@ -1256,8 +1256,8 @@ class ShopState extends State void _resetProductListScroll() { if (_listScrollController1 != null && - _listScrollController1.positions.isNotEmpty) { - _listScrollController1.animateTo( + _listScrollController1!.positions.isNotEmpty) { + _listScrollController1!.animateTo( 0, duration: new Duration( microseconds: 200, @@ -1270,9 +1270,9 @@ class ShopState extends State int _getCategoryIndexByRightScrollHeight(double height) { double cHeight = 0.0; if (height > 0) { - for (int i = 0; i < _categoryProducts.length; ++i) { + for (int i = 0; i < _categoryProducts!.length; ++i) { double categoryHeight = _categoryDescHeight + - _categoryProducts[i].products!.length * _productHeight; + _categoryProducts![i].products!.length * _productHeight; if (height >= cHeight && height < cHeight + categoryHeight) { return i; } @@ -1280,7 +1280,7 @@ class ShopState extends State } } if (height > cHeight) { - return _categoryProducts.length - 1; + return _categoryProducts!.length - 1; } return -1; } @@ -1310,7 +1310,7 @@ class ShopState extends State int numCategoriesHasProducts() { int num = 0; - for (CategoryProducts cp in _categoryProducts) { + for (CategoryProducts cp in _categoryProducts!) { if (cp.products!.length > 0) { num += 1; } @@ -1340,21 +1340,21 @@ class ShopState extends State _categoryProducts == null ? 0 : numCategoriesHasProducts(), itemBuilder: (BuildContext context, int i) { CategoryProducts cp; - cp = _categoryProducts[i]; + cp = _categoryProducts![i]; int index = -1; if (displayProductByCategoryClick) { if (categoryId > 0) { - for (var j = 0; j < _categoryProducts.length; j++) { - if (_categoryProducts[j].id == categoryId) { - cp = _categoryProducts[j]; + for (var j = 0; j < _categoryProducts!.length; j++) { + if (_categoryProducts![j].id == categoryId) { + cp = _categoryProducts![j]; index = j; break; } } if (cp == null) { index = 0; - cp = _categoryProducts[0]; + cp = _categoryProducts![0]; } } WidgetsBinding.instance.addPostFrameCallback((timeStamp) { @@ -1424,7 +1424,7 @@ class ShopState extends State pStack.children.add(Container( // width: MediaQuery.of(context).size.width - 100.0, child: ProductItem( - p, _business, + p, _business!, horizontal: true, imageWidth: 80.0, ), @@ -1498,9 +1498,9 @@ class ShopState extends State _listScrollController2 = _shopCoordinator.newChildScrollController(); _listScrollController3 = _shopCoordinator.newChildScrollController(); - _listScrollController1.addListener(() { - if (_listScrollController1.position.atEdge) { - if (_listScrollController1.position.pixels == 0) { + _listScrollController1!.addListener(() { + if (_listScrollController1!.position.atEdge) { + if (_listScrollController1!.position.pixels == 0) { print('product list at top'); } else { print('product list at bottom'); @@ -1567,7 +1567,7 @@ class ShopState extends State '', '', _hotSaleProducts); - _categoryProducts.insert(0, hs); + _categoryProducts!.insert(0, hs); } if (_featuredProducts.length > 0) { @@ -1578,7 +1578,7 @@ class ShopState extends State '', '', _featuredProducts); - _categoryProducts.insert(0, fe); + _categoryProducts!.insert(0, fe); } checkActionAndClose(context); diff --git a/lib/widgets/mobile/shopping_cart_bar.dart b/lib/widgets/mobile/shopping_cart_bar.dart index 5e43e91..215fd1f 100644 --- a/lib/widgets/mobile/shopping_cart_bar.dart +++ b/lib/widgets/mobile/shopping_cart_bar.dart @@ -35,21 +35,21 @@ class ShoppingCartBar extends StatefulWidget { } class ShoppingCartBarState extends State { - late CartInfo cartInfo; + CartInfo? cartInfo; double totalPrice = 0.0; @override Widget build(BuildContext context) { totalPrice = 0.0; cartInfo = Utils.getCartInfoByBusiness(store.state.cartInfos, widget.business)!; - if (cartInfo != null && cartInfo.businessInfo!.id == widget.business.id) { - totalPrice = cartInfo.getTotalPrice(); + if (cartInfo != null && cartInfo!.businessInfo!.id == widget.business.id) { + totalPrice = cartInfo!.getTotalPrice(); } Widget cartContent; - if (cartInfo == null || (cartInfo.businessInfo!.id != widget.business.id) - || (totalPrice == 0.0 && cartInfo.productList!.length == 0)) { + if (cartInfo == null || (cartInfo!.businessInfo!.id != widget.business.id) + || (totalPrice == 0.0 && cartInfo!.productList!.length == 0)) { cartContent = Center( child: Container( padding: EdgeInsets.all(20.0), @@ -92,8 +92,8 @@ class ShoppingCartBarState extends State { }, ), ); - for (var i = 0; i < cartInfo.productList!.length; i++) { - (cartContent as Column).children.add(cartLineItem(cartInfo.productList![i], i)); + for (var i = 0; i < cartInfo!.productList!.length; i++) { + (cartContent as Column).children.add(cartLineItem(cartInfo!.productList![i], i)); } }