phase3(critical-path): home page chain null-safe

home.dart + desktop/mobile navigation, carousels, index content widgets,
customers_logo, appbar_menu, navigation_drawer, MobileBottomNav, double_back.
Fixes: Key? params, nullable State fields, Scrollbar thumbVisibility,
ModalRoute.of()?, badges hide Badge, cartInfos local promotion.
This commit is contained in:
2026-07-24 13:42:03 +08:00
parent ae4c4046c3
commit 88dd90ed7c
16 changed files with 60 additions and 58 deletions

View File

@@ -34,7 +34,7 @@ import '../widgets/mobile/mobile_navigation_drawer.dart';
class Home extends StatefulWidget { class Home extends StatefulWidget {
final String title; final String title;
Home({Key key, this.title = ''}) : super(key: key); Home({Key? key, this.title = ''}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
@@ -46,11 +46,11 @@ class Home extends StatefulWidget {
class HomeState extends State<Home> { class HomeState extends State<Home> {
final _scaffoldKey = GlobalKey<ScaffoldState>(); final _scaffoldKey = GlobalKey<ScaffoldState>();
List<Gallery> galleries = []; List<Gallery> galleries = [];
String content1Message; String? content1Message;
Map<String, dynamic> content2; Map<String, dynamic>? content2;
StreamSubscription _sub; StreamSubscription? _sub;
Uri _latestUri; Uri? _latestUri;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -80,9 +80,9 @@ class HomeState extends State<Home> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
MobileIndexCarousel(galleries), MobileIndexCarousel(galleries),
MobileIndexMainContent1(content1Message), MobileIndexMainContent1(content1Message ?? ''),
MobileIndexMainContent2(content2), MobileIndexMainContent2(content2 ?? <String, dynamic>{}),
MobileIndexMainContent3(content2), MobileIndexMainContent3(content2 ?? <String, dynamic>{}),
], ],
), ),
), ),
@@ -91,24 +91,24 @@ class HomeState extends State<Home> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
DesktopIndexCarousel(galleries), DesktopIndexCarousel(galleries),
DesktopIndexMainContent1(content1Message), DesktopIndexMainContent1(content1Message ?? ''),
DesktopIndexMainContent2(content2), DesktopIndexMainContent2(content2 ?? <String, dynamic>{}),
CustomersLogo(), CustomersLogo(),
DesktopIndexMainContent3(content2), DesktopIndexMainContent3(content2 ?? <String, dynamic>{}),
], ],
), ),
), ),
desktop: Scrollbar( desktop: Scrollbar(
isAlwaysShown: true, thumbVisibility: true,
child: SingleChildScrollView( child: SingleChildScrollView(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
DesktopIndexCarousel(galleries), DesktopIndexCarousel(galleries),
DesktopIndexMainContent1(content1Message), DesktopIndexMainContent1(content1Message ?? ''),
DesktopIndexMainContent2(content2), DesktopIndexMainContent2(content2 ?? <String, dynamic>{}),
CustomersLogo(), CustomersLogo(),
DesktopIndexMainContent3(content2), DesktopIndexMainContent3(content2 ?? <String, dynamic>{}),
], ],
), ),
), ),
@@ -136,7 +136,7 @@ class HomeState extends State<Home> {
_loadData(); _loadData();
eventBus.on<OpenDrawer>().listen((event) { eventBus.on<OpenDrawer>().listen((event) {
if (mounted) { if (mounted) {
_scaffoldKey.currentState.openDrawer(); _scaffoldKey.currentState?.openDrawer();
} }
}); });
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
@@ -163,7 +163,7 @@ class HomeState extends State<Home> {
if (!mounted) return; if (!mounted) return;
_latestUri = Uri.base; _latestUri = Uri.base;
print('uri base $_latestUri'); print('uri base $_latestUri');
eventBus.fire(OnGotDeepLinkUri(_latestUri)); eventBus.fire(OnGotDeepLinkUri(_latestUri!));
} else { } else {
// _sub = getUriLinksStream().listen((Uri uri) { // _sub = getUriLinksStream().listen((Uri uri) {
// print('_sub should get uri $uri'); // print('_sub should get uri $uri');
@@ -189,7 +189,7 @@ class HomeState extends State<Home> {
// //
// if (!mounted) return; // if (!mounted) return;
// _latestUri = initialUri; // _latestUri = initialUri;
// eventBus.fire(OnGotDeepLinkUri(_latestUri)); // eventBus.fire(OnGotDeepLinkUri(_latestUri!));
} }
} }
} }

View File

@@ -7,7 +7,7 @@ import '../../utils/util_web.dart' if (dart.library.io) '../../utils/util_io.dar
class DesktopIndexCarousel extends StatefulWidget { class DesktopIndexCarousel extends StatefulWidget {
final List<Gallery> galleries; final List<Gallery> galleries;
const DesktopIndexCarousel(this.galleries, {Key key}) : super(key: key); const DesktopIndexCarousel(this.galleries, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
@@ -53,8 +53,8 @@ class DesktopIndexCarouselState extends State<DesktopIndexCarousel> {
), ),
), ),
onTap: () { onTap: () {
if (i.linkUrl != null && i.linkUrl.isNotEmpty) { if (i.linkUrl?.isNotEmpty == true) {
Util.openWebUrl(context, i.linkUrl); Util.openWebUrl(context, i.linkUrl!);
} }
}, },
), ),

View File

@@ -12,12 +12,12 @@ import '../../widgets/general/navigationbar_logo.dart';
import '../../widgets/general/text_link.dart'; import '../../widgets/general/text_link.dart';
class DesktopAppBarMenu extends StatelessWidget { class DesktopAppBarMenu extends StatelessWidget {
User _user; User? _user;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_user = store.state.user; _user = store.state.user;
String currentRoute = ModalRoute.of(context).settings.name; String currentRoute = ModalRoute.of(context)?.settings.name ?? '';
Widget menuBar = Container( Widget menuBar = Container(
height: 56.0, height: 56.0,
padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 5.0), padding: EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 5.0),

View File

@@ -10,7 +10,7 @@ import '../../utils/util_web.dart' if (dart.library.io) '../../utils/util_io.dar
class CustomersLogo extends StatefulWidget { class CustomersLogo extends StatefulWidget {
const CustomersLogo({Key key}) : super(key: key); const CustomersLogo({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() => CustomersLogoState(); State<StatefulWidget> createState() => CustomersLogoState();

View File

@@ -4,7 +4,7 @@ import 'package:flutter_wisetronic/generated/l10n.dart';
class DesktopIndexMainContent1 extends StatefulWidget { class DesktopIndexMainContent1 extends StatefulWidget {
final String message; final String message;
const DesktopIndexMainContent1(this.message, {Key key}) : super(key: key); const DesktopIndexMainContent1(this.message, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {

View File

@@ -6,7 +6,7 @@ import '../../utils/util_web.dart' if (dart.library.io) '../../utils/util_io.dar
class DesktopIndexMainContent2 extends StatefulWidget { class DesktopIndexMainContent2 extends StatefulWidget {
final Map<String, dynamic> content; final Map<String, dynamic> content;
const DesktopIndexMainContent2(this.content, {Key key}) : super(key: key); const DesktopIndexMainContent2(this.content, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {

View File

@@ -7,7 +7,7 @@ import '../../constants.dart';
class DesktopIndexMainContent3 extends StatefulWidget { class DesktopIndexMainContent3 extends StatefulWidget {
final Map<String, dynamic> content; final Map<String, dynamic> content;
const DesktopIndexMainContent3(this.content, {Key key}) : super(key: key); const DesktopIndexMainContent3(this.content, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {

View File

@@ -14,12 +14,12 @@ import '../../widgets/general/breadcrumbs.dart';
import '../../widgets/general/navigationbar.dart'; import '../../widgets/general/navigationbar.dart';
class DesktopNavigationBar extends StatefulWidget { class DesktopNavigationBar extends StatefulWidget {
final bool hasBack; final bool? hasBack;
final List<BreadCrumb> breadCrumbs; final List<BreadCrumb>? breadCrumbs;
final Widget shoppingCart; final Widget? shoppingCart;
final OnBackPress onBackPress; final OnBackPress? onBackPress;
const DesktopNavigationBar({Key key, this.hasBack, this.breadCrumbs, const DesktopNavigationBar({Key? key, this.hasBack, this.breadCrumbs,
this.shoppingCart, this.onBackPress}) : super(key: key); this.shoppingCart, this.onBackPress}) : super(key: key);
@override @override
@@ -30,16 +30,16 @@ class DesktopNavigationBar extends StatefulWidget {
} }
class DesktopNavigationBarState extends State<DesktopNavigationBar> { class DesktopNavigationBarState extends State<DesktopNavigationBar> {
User _user; User? _user;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget sc = SizedBox.shrink(); Widget sc = SizedBox.shrink();
if (widget.shoppingCart != null) { if (widget.shoppingCart != null) {
sc = widget.shoppingCart; sc = widget.shoppingCart!;
} }
Widget breadCrumbBar = SizedBox.shrink(); Widget breadCrumbBar = SizedBox.shrink();
if (widget.breadCrumbs != null && widget.breadCrumbs.length > 0) { if (widget.breadCrumbs != null && widget.breadCrumbs!.length > 0) {
breadCrumbBar = Container( breadCrumbBar = Container(
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
height: Constants.BREADCRUMB_HEIGHT, height: Constants.BREADCRUMB_HEIGHT,

View File

@@ -6,7 +6,7 @@ import '../../utils/double_back_to_close_app.dart';
class DoubleBackToCloseAppWrapper extends StatelessWidget { class DoubleBackToCloseAppWrapper extends StatelessWidget {
final Widget child; final Widget child;
const DoubleBackToCloseAppWrapper({Key key, this.child}) : super(key: key); const DoubleBackToCloseAppWrapper({Key? key, required this.child}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@@ -1,6 +1,6 @@
import 'package:badges/badges.dart'; import 'package:badges/badges.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart' hide Badge;
import '../../constants.dart'; import '../../constants.dart';
import '../../generated/l10n.dart'; import '../../generated/l10n.dart';
import '../../routes.dart'; import '../../routes.dart';
@@ -15,10 +15,11 @@ class MobileBottomNav extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (store.state.cartInfos != null && store.state.cartInfos.length > 0) { final cartInfos = store.state.cartInfos;
if (cartInfos != null && cartInfos.length > 0) {
count = 0; count = 0;
for (var i = 0; i < store.state.cartInfos.length; i++) { for (var i = 0; i < cartInfos.length; i++) {
if (store.state.cartInfos[i].productList != null && store.state.cartInfos[i].productList.length > 0) { if (cartInfos[i].productList != null && cartInfos[i].productList!.length > 0) {
count += 1; count += 1;
} }
} }

View File

@@ -7,7 +7,7 @@ import '../../utils/util_web.dart' if (dart.library.io) '../../utils/util_io.dar
class MobileIndexCarousel extends StatefulWidget { class MobileIndexCarousel extends StatefulWidget {
final List<Gallery> galleries; final List<Gallery> galleries;
const MobileIndexCarousel(this.galleries, {Key key}) : super(key: key); const MobileIndexCarousel(this.galleries, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
@@ -39,8 +39,8 @@ class MobileIndexCarouselState extends State<MobileIndexCarousel> {
), ),
), ),
onTap: () { onTap: () {
if (i.linkUrl != null && i.linkUrl.isNotEmpty) { if (i.linkUrl?.isNotEmpty == true) {
Util.openWebUrl(context, i.linkUrl); Util.openWebUrl(context, i.linkUrl!);
} }
}, },
), ),

View File

@@ -5,7 +5,7 @@ import 'package:flutter_wisetronic/generated/l10n.dart';
class MobileIndexMainContent1 extends StatefulWidget { class MobileIndexMainContent1 extends StatefulWidget {
final String message; final String message;
const MobileIndexMainContent1(this.message, {Key key}) : super(key: key); const MobileIndexMainContent1(this.message, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {

View File

@@ -7,7 +7,7 @@ import '../../utils/util_web.dart' if (dart.library.io) '../../utils/util_io.dar
class MobileIndexMainContent2 extends StatefulWidget { class MobileIndexMainContent2 extends StatefulWidget {
final Map<String, dynamic> content; final Map<String, dynamic> content;
const MobileIndexMainContent2(this.content, {Key key}) : super(key: key); const MobileIndexMainContent2(this.content, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {

View File

@@ -7,7 +7,7 @@ import '../../utils/util_web.dart' if (dart.library.io) '../../utils/util_io.dar
class MobileIndexMainContent3 extends StatefulWidget { class MobileIndexMainContent3 extends StatefulWidget {
final Map<String, dynamic> content; final Map<String, dynamic> content;
const MobileIndexMainContent3(this.content, {Key key}) : super(key: key); const MobileIndexMainContent3(this.content, {Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {

View File

@@ -13,7 +13,7 @@ import '../../widgets/mobile/mobile_navigation_drawer_header.dart';
import '../../constants.dart'; import '../../constants.dart';
class MobileNavigationDrawer extends StatefulWidget { class MobileNavigationDrawer extends StatefulWidget {
const MobileNavigationDrawer({Key key}) : super(key: key); const MobileNavigationDrawer({Key? key}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
@@ -23,11 +23,11 @@ class MobileNavigationDrawer extends StatefulWidget {
} }
class MobileNavigationDrawerState extends State<MobileNavigationDrawer> { class MobileNavigationDrawerState extends State<MobileNavigationDrawer> {
User _user; User? _user;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String currentRoute = ModalRoute.of(context).settings.name; String currentRoute = ModalRoute.of(context)?.settings.name ?? '';
return Container( return Container(
width: 200.0, width: 200.0,

View File

@@ -10,11 +10,12 @@ import '../../widgets/general/navigationbar_logo.dart';
import '../../routes.dart'; import '../../routes.dart';
class MobileNavigationBar extends StatefulWidget { class MobileNavigationBar extends StatefulWidget {
final String title; final String? title;
final bool back; final bool? back;
final bool toHome; final bool? toHome;
final bool showMe; final bool? showMe;
const MobileNavigationBar({Key key, this.title, this.back, this.toHome, this.showMe}) : super(key: key);
const MobileNavigationBar({Key? key, this.title, this.back, this.toHome, this.showMe}) : super(key: key);
@override @override
State<StatefulWidget> createState() { State<StatefulWidget> createState() {
@@ -24,19 +25,19 @@ class MobileNavigationBar extends StatefulWidget {
} }
class MobileNavigationBarState extends State<MobileNavigationBar> { class MobileNavigationBarState extends State<MobileNavigationBar> {
User _user; User? _user;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppBar( return AppBar(
leading: widget.back ? leading: widget.back == true ?
IconButton( IconButton(
icon: Icon( icon: Icon(
Icons.arrow_back_ios, Icons.arrow_back_ios,
color: Colors.white, color: Colors.white,
), ),
onPressed: () { onPressed: () {
if (widget.toHome) { if (widget.toHome == true) {
Routes.router.navigateTo(context, '/', clearStack: true); Routes.router.navigateTo(context, '/', clearStack: true);
} else { } else {
Routes.router.pop(context); Routes.router.pop(context);
@@ -53,7 +54,7 @@ class MobileNavigationBarState extends State<MobileNavigationBar> {
}, },
), ),
title: Container( title: Container(
child: widget.title.isNotEmpty ? child: widget.title?.isNotEmpty == true ?
Container( Container(
child: Text( child: Text(
'${widget.title}', '${widget.title}',