From a4c3106a2805034d1734c8d35fd227519846b67f Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Mon, 22 Apr 2024 21:33:27 +0800 Subject: [PATCH] feat:游戏列表页 --- lib/pages/games/bloc.dart | 29 +++++++++++++++++++++++++++++ lib/pages/games/event.dart | 10 ++++++++++ lib/pages/games/state.dart | 9 +++++++++ lib/pages/games/view.dart | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 0 deletions(-) create mode 100644 lib/pages/games/bloc.dart create mode 100644 lib/pages/games/event.dart create mode 100644 lib/pages/games/state.dart create mode 100644 lib/pages/games/view.dart diff --git a/lib/pages/games/bloc.dart b/lib/pages/games/bloc.dart new file mode 100644 index 0000000..f21ae28 --- /dev/null +++ b/lib/pages/games/bloc.dart @@ -0,0 +1,29 @@ +import 'package:bloc/bloc.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; + +import 'event.dart'; +import 'state.dart'; + +class GamesBloc extends Bloc { + + late MethodChannel _methodChannel; + + GamesBloc() : super(GamesState().init()) { + on(_init); + on(_gotoGamePage); + } + + void _init(InitEvent event, Emitter emit) async { + emit(state.clone()); + } + + void _gotoGamePage(GotoGamePageEvent event, Emitter emit) async { + try { + _methodChannel = const MethodChannel('wow_english/game_method_channel'); + await _methodChannel.invokeMethod('openGamePage', { "gameId": event.gameId }); + } on PlatformException catch (e) { + debugPrint("Failed to go to native page: '${e.message}'."); + } + } +} diff --git a/lib/pages/games/event.dart b/lib/pages/games/event.dart new file mode 100644 index 0000000..a93bc66 --- /dev/null +++ b/lib/pages/games/event.dart @@ -0,0 +1,10 @@ +abstract class GamesEvent {} + +class InitEvent extends GamesEvent {} + +///进入游戏页面 +class GotoGamePageEvent extends GamesEvent { + late final int gameId; + + GotoGamePageEvent(this.gameId); +} \ No newline at end of file diff --git a/lib/pages/games/state.dart b/lib/pages/games/state.dart new file mode 100644 index 0000000..b85f56b --- /dev/null +++ b/lib/pages/games/state.dart @@ -0,0 +1,9 @@ +class GamesState { + GamesState init() { + return GamesState(); + } + + GamesState clone() { + return GamesState(); + } +} diff --git a/lib/pages/games/view.dart b/lib/pages/games/view.dart new file mode 100644 index 0000000..1dcc9d3 --- /dev/null +++ b/lib/pages/games/view.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; + +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:wow_english/common/extension/string_extension.dart'; +import 'package:wow_english/common/widgets/we_app_bar.dart'; +import 'package:wow_english/pages/games/state.dart'; + +import '../games/event.dart'; +import 'bloc.dart'; + + +class GamesPage extends StatelessWidget { + const GamesPage({super.key}); + + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (BuildContext context) => GamesBloc()..add(InitEvent()), + child: Builder(builder: (context) => _GamesPageView()), + ); + } +} + +class _GamesPageView extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BlocListener( + listener: (context, state) { + + }, + child: Scaffold( + appBar: const WEAppBar( + titleText: '游戏列表', + centerTitle: false, + ), + body: _gamesView(), + ), + ); + } + + Widget _gamesView() => BlocBuilder( + builder: (context, state) { + final bloc = BlocProvider.of(context); + //屏幕中间横着放四张图片一行展示(尺寸120*200),每张图片下方有行文字 + return GridView.builder( + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 4, + crossAxisSpacing: 10, + mainAxisSpacing: 10, + childAspectRatio: 0.6, + ), + itemCount: 4, + itemBuilder: (BuildContext context, int index) { + // final entity = bloc.listData[index]; + return GestureDetector( + onTap: () { + bloc.add(GotoGamePageEvent(1)); + }, + child: Container( + decoration: BoxDecoration( + border: Border.all( + width: 1.0, + color: const Color(0xFF140C10), + ), + borderRadius: BorderRadius.circular(21), + ), + child: Column( + children: [ + Image.asset('pic_module_study'.assetPng, width: 120, height: 200), + Text('游戏名称', style: TextStyle(fontSize: 14.sp, color: const Color(0xFF140C10))) + ], + ), + ), + ); + }); + }); +} + -- libgit2 0.22.2