| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817 |
- import 'package:easy_refresh/easy_refresh.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_riverpod/flutter_riverpod.dart';
- import 'package:flutter_screenutil/flutter_screenutil.dart';
- import 'package:go_router/go_router.dart';
- import 'package:news_app/event/logout_event.dart';
- import 'package:news_app/provider/global_theme_provider.dart';
- import 'package:news_app/provider/global_user_provider.dart';
- import 'package:news_app/provider/gray_provider.dart';
- import 'package:news_app/provider/main_provider.dart';
- import 'package:news_app/ui/activity/activity_detail_page.dart';
- import 'package:news_app/ui/activity/main_activity_page.dart';
- import 'package:news_app/ui/login/login_register_page.dart';
- import 'package:news_app/ui/login/privacy_agreement_page.dart';
- import 'package:news_app/ui/login/splash_page.dart';
- import 'package:news_app/ui/me/edit_user_profile_page.dart';
- import 'package:news_app/ui/me/main_user_page.dart';
- import 'package:news_app/ui/me/msg_center_page.dart';
- import 'package:news_app/ui/me/setting_page.dart';
- import 'package:news_app/ui/me/user_activity_page.dart';
- import 'package:news_app/ui/me/user_change_password.dart';
- import 'package:news_app/ui/me/user_favorite_page.dart';
- import 'package:news_app/ui/me/user_feedback_page.dart';
- import 'package:news_app/ui/me/user_read_history_page.dart';
- import 'package:news_app/ui/me/user_score_page.dart';
- import 'package:news_app/ui/me/user_share_page.dart';
- import 'package:news_app/ui/me/user_shop_page.dart';
- import 'package:news_app/ui/news/main_news_page.dart';
- import 'package:news_app/ui/news/news_detail_page.dart';
- import 'package:news_app/ui/news/special_list_page.dart';
- import 'package:news_app/ui/search/activity_search_page.dart';
- import 'package:news_app/ui/search/search_result_page.dart';
- import 'package:news_app/ui/search/video_search_page.dart';
- import 'package:news_app/ui/topic/main_topic_page.dart';
- import 'package:news_app/ui/topic/topic_detail_page.dart';
- import 'package:news_app/ui/topic/topic_list_page.dart';
- import 'package:news_app/ui/video/main_video_page.dart';
- import 'package:news_app/ui/video/video_detail_page.dart';
- import 'package:news_app/util/log.util.dart';
- import 'package:news_app/util/shared_prefs_instance_util.dart';
- import 'package:news_app/util/theme_util.dart';
- import 'constant/config.dart';
- import 'gen/assets.gen.dart';
- import 'http/http_util.dart';
- import 'model/user_model.dart';
- /// @author: bo.zeng
- /// @email: cnhbwds@gmail.com
- /// @date: 2025 2025/4/9 16:00
- /// @description:
- void _initBeforeApp() async {
- WidgetsFlutterBinding.ensureInitialized();
- //全局配置 Dio
- HttpUtil();
- // 全局配置EasyRefresh
- EasyRefresh.defaultHeaderBuilder =
- () => ClassicHeader(
- dragText: '下拉刷新',
- armedText: '释放刷新',
- readyText: '正在刷新...',
- processingText: '刷新中...',
- processedText: '刷新完成',
- noMoreText: '没有更多数据',
- failedText: '刷新失败',
- messageText: '最后更新于 %T',
- messageStyle: TextStyle(color: Colors.grey[500], fontSize: 12),
- textStyle: TextStyle(color: Colors.grey[700], fontSize: 13),
- );
- EasyRefresh.defaultFooterBuilder =
- () => ClassicFooter(
- dragText: '上拉加载',
- armedText: '释放加载',
- readyText: '准备加载...',
- processingText: '加载中...',
- processedText: '加载完成',
- noMoreText: '没有更多数据了',
- failedText: '加载失败',
- messageText: '最后加载于 %T',
- messageStyle: TextStyle(color: Colors.grey[500], fontSize: 12),
- textStyle: TextStyle(color: Colors.grey[700], fontSize: 13),
- );
- // 初始化全局 SharedPreferences
- await initSharedPrefs();
- }
- final grayProvider = NotifierProvider<GrayProvider, bool>(() => GrayProvider());
- void main() {
- _initBeforeApp();
- runApp(ProviderScope(child: const MyApp()));
- }
- final globalThemeProvider = NotifierProvider<GlobalThemeNotifier, ThemeMode>(
- () {
- return GlobalThemeNotifier();
- },
- );
- final globalUserProvider = NotifierProvider<GlobalUserNotifier, UserModel>(() {
- return GlobalUserNotifier();
- });
- class MyApp extends ConsumerWidget {
- const MyApp({super.key});
- @override
- Widget build(BuildContext context, WidgetRef ref) {
- ref.read(grayProvider.notifier).fetchGray();
- bool gray = ref.watch(grayProvider);
- return ScreenUtilInit(
- designSize: const Size(375, 812),
- splitScreenMode: true,
- //支持分屏尺寸
- minTextAdapt: true,
- //否根据宽度/高度中的最小值适配文字
- builder: (context, child) {
- return gray
- ? ColorFiltered(
- colorFilter: ColorFilter.matrix(<double>[
- 0.2126, 0.7152, 0.0722, 0, 0, // R
- 0.2126, 0.7152, 0.0722, 0, 0, // G
- 0.2126, 0.7152, 0.0722, 0, 0, // B
- 0, 0, 0, 1, 0, // A
- ]),
- child: MaterialApp.router(
- debugShowCheckedModeBanner: false,
- theme: lightTheme,
- // 白天模式
- darkTheme: darkTheme,
- // 黑夜模式
- themeMode: ref.watch(globalThemeProvider),
- routerConfig: _routerConfig,
- ),
- )
- : MaterialApp.router(
- debugShowCheckedModeBanner: false,
- theme: lightTheme,
- // 白天模式
- darkTheme: darkTheme,
- // 黑夜模式
- themeMode: ref.watch(globalThemeProvider),
- routerConfig: _routerConfig,
- );
- },
- );
- }
- }
- class MainPage extends ConsumerStatefulWidget {
- const MainPage({super.key});
- @override
- ConsumerState<MainPage> createState() => _MainPageState();
- }
- class _MainPageState extends ConsumerState<MainPage> {
- late PageController _pageController;
- void _requestUserInfo() async {
- uuid = await getUuid() ?? "";
- // 获取用户信息
- await ref.read(globalUserProvider.notifier).fetchUserInfo();
- }
- @override
- void initState() {
- super.initState();
- _requestUserInfo();
- _pageController = PageController(initialPage: 0);
- _registerEventBus();
- }
- void _registerEventBus() {
- eventBus.on<LogoutEvent>().listen((event) {
- consoleLog("用户退出了");
- ref.read(globalUserProvider.notifier).clearUserInfo();
- ref.invalidate(globalUserProvider);
- if (event.jumLogin) {
- final currentLocation =
- _routerConfig.routerDelegate.state.matchedLocation;
- consoleLog(currentLocation);
- //如果在首页,就不跳转
- if (currentLocation != "/main") {
- rootNavigatorKey.currentContext?.go('/login');
- }
- } else {
- _pageController.jumpToPage(0);
- ref.read(mainPageProvider.notifier).changeNavIndex(0);
- }
- });
- }
- @override
- void dispose() {
- super.dispose();
- _pageController.dispose();
- }
- final mainPageProvider = NotifierProvider<MainPageProvider, int>(() {
- return MainPageProvider();
- });
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- body: PageView(
- scrollDirection: Axis.horizontal,
- controller: _pageController,
- physics: const NeverScrollableScrollPhysics(),
- children: [
- MainNewsPage(),
- MainActivityPage(),
- MainVideoPage(),
- // MainTopicPage(),
- MainUserPage(),
- ],
- ),
- bottomNavigationBar: BottomNavigationBar(
- elevation: 10,
- type: BottomNavigationBarType.fixed,
- selectedItemColor: Colors.blue,
- unselectedItemColor: Colors.grey,
- currentIndex: ref.watch(mainPageProvider),
- items: [
- BottomNavigationBarItem(
- icon: Image.asset(
- Assets.images.navNewsUnselect.path,
- width: 20.w,
- height: 20.w,
- ),
- label: "新闻",
- activeIcon: Image.asset(
- Assets.images.navNewsSelect.path,
- width: 20.w,
- height: 20.w,
- ),
- ),
- BottomNavigationBarItem(
- icon: Image.asset(
- Assets.images.navActivityUnselect.path,
- width: 20.w,
- height: 20.w,
- ),
- activeIcon: Image.asset(
- Assets.images.navActivitySelect.path,
- width: 20.w,
- height: 20.w,
- ),
- label: "活动",
- ),
- BottomNavigationBarItem(
- icon: Image.asset(
- Assets.images.navVideoUnselect.path,
- width: 20.w,
- height: 20.w,
- ),
- label: "视频",
- activeIcon: Image.asset(
- Assets.images.navVideoSelect.path,
- width: 20.w,
- height: 20.w,
- ),
- ),
- // BottomNavigationBarItem(
- // icon: Image.asset(
- // Assets.images.navTopicUnselect.path,
- // width: 20.w,
- // height: 20.w,
- // ),
- // label: "话题",
- // activeIcon: Image.asset(
- // Assets.images.navTopicSelect.path,
- // width: 20.w,
- // height: 20.w,
- // ),
- // ),
- BottomNavigationBarItem(
- icon: Image.asset(
- Assets.images.navUserUnselect.path,
- width: 20.w,
- height: 20.w,
- ),
- label: "我的",
- activeIcon: Image.asset(
- Assets.images.navUserSelect.path,
- width: 20.w,
- height: 20.w,
- ),
- ),
- ],
- onTap: (index) {
- if (index == 3 && uuid.isEmpty) {
- context.push('/login');
- return;
- }
- _pageController.jumpToPage(index);
- ref.read(mainPageProvider.notifier).changeNavIndex(index);
- },
- ),
- );
- }
- }
- /// The route configuration.
- final GoRouter _routerConfig = GoRouter(
- navigatorKey: rootNavigatorKey,
- routes: <RouteBase>[
- GoRoute(
- path: '/',
- builder: (BuildContext context, GoRouterState state) {
- return const SplashPage();
- },
- ),
- GoRoute(
- path: '/login',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: LoginRegisterPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/login',
- // builder: (BuildContext context, GoRouterState state) {
- // return const LoginRegisterPage();
- // },
- // ),
- GoRoute(
- path: '/main',
- builder: (BuildContext context, GoRouterState state) {
- return const MainPage();
- },
- ),
- GoRoute(
- path: '/news/detail',
- pageBuilder: (context, state) {
- String contentId = state.extra as String;
- return CustomTransitionPage(
- key: state.pageKey,
- child: NewsDetailPage(contentId),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/news/detail',
- // builder: (BuildContext context, GoRouterState state) {
- // String contentId = state.extra as String;
- // return NewsDetailPage(contentId);
- // },
- // ),
- GoRoute(
- path: '/activity/detail',
- pageBuilder: (context, state) {
- String activityId = state.extra as String;
- return CustomTransitionPage(
- key: state.pageKey,
- child: ActivityDetailPage(activityId),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/activity/detail",
- // builder: (BuildContext context, GoRouterState state) {
- // String activityId = state.extra as String;
- // return ActivityDetailPage(activityId);
- // },
- // ),
- GoRoute(
- path: '/video/detail',
- pageBuilder: (context, state) {
- VideoParam data = state.extra as VideoParam;
- // return VideoDetailPage(param: data);
- return CustomTransitionPage(
- key: state.pageKey,
- child: VideoDetailPage(param: data),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/video/detail',
- // builder: (BuildContext context, GoRouterState state) {
- // VideoParam data = state.extra as VideoParam;
- // return VideoDetailPage(param: data);
- // },
- // ),
- GoRoute(
- path: '/user/editProfile',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: EditProfilePage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/editProfile',
- // builder: (BuildContext context, GoRouterState state) {
- // return const EditProfilePage();
- // },
- // ),
- GoRoute(
- path: '/user/score',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserScorePage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/score',
- // builder: (BuildContext context, GoRouterState state) {
- // return const UserScorePage();
- // },
- // ),
- GoRoute(
- path: '/user/msgCenter',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: MsgCenterPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/msgCenter',
- // builder: (BuildContext context, GoRouterState state) {
- // return const MsgCenterPage();
- // },
- // ),
- GoRoute(
- path: '/user/favorite',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserFavoritePage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/favorite',
- // builder: (BuildContext context, GoRouterState state) {
- // return const UserFavoritePage();
- // },
- // ),
- GoRoute(
- path: '/user/readHistory',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserReadHistoryPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/readHistory',
- // builder: (BuildContext context, GoRouterState state) {
- // return const UserReadHistoryPage();
- // },
- // ),
- GoRoute(
- path: '/user/setting',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: SettingPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/setting',
- // builder: (BuildContext context, GoRouterState state) {
- // return const SettingPage();
- // },
- // ),
- GoRoute(
- path: '/user/feedback',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserFeedbackPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/feedback',
- // builder: (BuildContext context, GoRouterState state) {
- // return const UserFeedbackPage();
- // },
- // ),
- GoRoute(
- path: '/user/share',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserSharePage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: '/user/share',
- // builder: (BuildContext context, GoRouterState state) {
- // return const UserSharePage();
- // },
- // ),
- GoRoute(
- path: '/user/activity',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserActivityPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/user/activity",
- // builder: (BuildContext context, GoRouterState state) {
- // return UserActivityPage();
- // },
- // ),
- GoRoute(
- path: '/topic/list',
- pageBuilder: (context, state) {
- final contentId = state.extra as String;
- return CustomTransitionPage(
- key: state.pageKey,
- child: TopicListPage(contentId: contentId),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- GoRoute(
- path: '/topic/detail',
- pageBuilder: (context, state) {
- final contentId = state.extra as String;
- return CustomTransitionPage(
- key: state.pageKey,
- child: TopicDetailPage(contentId: contentId),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/topic/detail",
- // builder: (BuildContext context, GoRouterState state) {
- // final contentId = state.extra as String;
- // return TopicDetailPage(contentId: contentId);
- // },
- // ),
- GoRoute(
- path: '/search',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: SearchResultPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/search",
- // builder: (BuildContext context, GoRouterState state) {
- // return SearchResultPage();
- // },
- // ),
- GoRoute(
- path: '/video/search',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: VideoSearchPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/video/search",
- // builder: (BuildContext context, GoRouterState state) {
- // return VideoSearchPage();
- // },
- // ),
- GoRoute(
- path: '/activity/search',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: ActivitySearchPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/activity/search",
- // builder: (BuildContext context, GoRouterState state) {
- // return ActivitySearchPage();
- // },
- // ),
- //
- GoRoute(
- path: '/user/privacy',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: PrivacyAgreementPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/user/privacy",
- // builder: (BuildContext context, GoRouterState state) {
- // return PrivacyAgreementPage();
- // },
- // ),
- GoRoute(
- path: '/user/changePassword',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserChangePassword(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- // GoRoute(
- // path: "/user/changePassword",
- // builder: (BuildContext context, GoRouterState state) {
- // return UserChangePassword();
- // },
- // ),
- GoRoute(
- path: '/user/shop',
- pageBuilder: (context, state) {
- return CustomTransitionPage(
- key: state.pageKey,
- child: UserShopPage(),
- transitionsBuilder: (context, animation, secondaryAnimation, child) {
- return FadeTransition(
- opacity: CurveTween(
- curve: Curves.easeInOutCirc,
- ).animate(animation),
- child: child,
- );
- },
- );
- },
- ),
- GoRoute(
- path: SpecialListPage.routeName,
- builder: (BuildContext context, GoRouterState state) {
- String cid =
- state.extra == null ? "670577300123717" : state.extra as String;
- return SpecialListPage(cid: cid);
- },
- ),
- ],
- );
|