@@ -3,6 +3,7 @@ import 'dart:developer';
33
44import 'package:flutter/material.dart' ;
55import 'package:flutter_sdui/src/generated/sdui.pb.dart' ;
6+ import 'package:flutter_sdui/src/widgets/sdui_appbar.dart' ;
67import 'package:flutter_sdui/src/widgets/sdui_column.dart' ;
78import 'package:flutter_sdui/src/widgets/sdui_container.dart' ;
89import 'package:flutter_sdui/src/widgets/sdui_icon.dart' ;
@@ -55,6 +56,8 @@ class SduiParser {
5556 return _parseJsonSpacer (data);
5657 case 'icon' :
5758 return _parseJsonIcon (data);
59+ case 'appbar' :
60+ return _parseJsonAppBar (data);
5861 default :
5962 return SduiContainer ();
6063 }
@@ -91,6 +94,8 @@ class SduiParser {
9194 return _parseProtoSpacer (data);
9295 case WidgetType .ICON :
9396 return _parseProtoIcon (data);
97+ case WidgetType .APPBAR :
98+ return _parseProtoAppBar (data);
9499 default :
95100 log ('Unsupported widget type: ${data .type }' );
96101 return SduiContainer ();
@@ -407,6 +412,33 @@ class SduiParser {
407412 );
408413 }
409414
415+ static SduiAppBar _parseProtoAppBar (SduiWidgetData data) {
416+ String ? title = data.stringAttributes['title' ];
417+ Color ? backgroundColor = data.hasBackgroundColor ()
418+ ? _parseProtoColor (data.backgroundColor)
419+ : null ;
420+ double ? elevation = data.doubleAttributes['elevation' ];
421+ bool ? centerTitle = data.boolAttributes['centerTitle' ];
422+
423+ return SduiAppBar (
424+ title: title,
425+ backgroundColor: backgroundColor,
426+ foregroundColor: null ,
427+ elevation: elevation,
428+ centerTitle: centerTitle,
429+ actions: null ,
430+ leading: null ,
431+ bottom: null ,
432+ toolbarHeight: null ,
433+ leadingWidth: null ,
434+ automaticallyImplyLeading: null ,
435+ flexibleSpace: null ,
436+ titleSpacing: null ,
437+ toolbarOpacity: null ,
438+ bottomOpacity: null ,
439+ );
440+ }
441+
410442 /// Helper methods for parsing protobuf attribute types into Flutter types.
411443
412444 /// Parses a string value into a [BoxFit] enum.
@@ -1223,6 +1255,60 @@ class SduiParser {
12231255 );
12241256 }
12251257
1258+ static SduiAppBar _parseJsonAppBar (Map <String , dynamic > data) {
1259+ List <Widget >? actions;
1260+ if (data['actions' ] is List ) {
1261+ actions = (data['actions' ] as List )
1262+ .map ((a) => SduiParser .parseJSON (a as Map <String , dynamic >).toFlutterWidget ())
1263+ .toList ();
1264+ }
1265+
1266+ Widget ? leading;
1267+ if (data['leading' ] != null ) {
1268+ leading = SduiParser .parseJSON (data['leading' ] as Map <String , dynamic >)
1269+ .toFlutterWidget ();
1270+ }
1271+
1272+ Widget ? flexibleSpace;
1273+ if (data['flexibleSpace' ] != null ) {
1274+ flexibleSpace =
1275+ SduiParser .parseJSON (data['flexibleSpace' ] as Map <String , dynamic >)
1276+ .toFlutterWidget ();
1277+ }
1278+
1279+ return SduiAppBar (
1280+ title: data['title' ]? .toString (),
1281+ backgroundColor: _parseJsonColor (data['backgroundColor' ]),
1282+ foregroundColor: _parseJsonColor (data['foregroundColor' ]),
1283+ elevation: (data['elevation' ] is num )
1284+ ? (data['elevation' ] as num ).toDouble ()
1285+ : null ,
1286+ centerTitle: data['centerTitle' ] is bool ? data['centerTitle' ] : null ,
1287+ actions: actions,
1288+ leading: leading,
1289+ bottom: null , // Complex widget, needs special handling
1290+ toolbarHeight: (data['toolbarHeight' ] is num )
1291+ ? (data['toolbarHeight' ] as num ).toDouble ()
1292+ : null ,
1293+ leadingWidth: (data['leadingWidth' ] is num )
1294+ ? (data['leadingWidth' ] as num ).toDouble ()
1295+ : null ,
1296+ automaticallyImplyLeading: data['automaticallyImplyLeading' ] is bool
1297+ ? data['automaticallyImplyLeading' ]
1298+ : null ,
1299+ flexibleSpace: flexibleSpace,
1300+ titleSpacing: (data['titleSpacing' ] is num )
1301+ ? (data['titleSpacing' ] as num ).toDouble ()
1302+ : null ,
1303+ toolbarOpacity: (data['toolbarOpacity' ] is num )
1304+ ? (data['toolbarOpacity' ] as num ).toDouble ()
1305+ : null ,
1306+ bottomOpacity: (data['bottomOpacity' ] is num )
1307+ ? (data['bottomOpacity' ] as num ).toDouble ()
1308+ : null ,
1309+ );
1310+ }
1311+
12261312 // --- JSON attribute helpers (implement as needed, similar to proto helpers) ---
12271313 static TextStyle ? _parseJsonTextStyle (dynamic value) {
12281314 if (value is ! Map <String , dynamic >) return null ;
0 commit comments