Skip to content

Commit 6563b01

Browse files
committed
refactor: move material image into GameMaterial widget
换了种更加优雅的实现
1 parent b151999 commit 6563b01

File tree

4 files changed

+78
-60
lines changed

4 files changed

+78
-60
lines changed

lib/material/images.dart

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import 'dart:async';
2+
import 'dart:ui' as ui;
23

34
import 'package:flutter/material.dart';
4-
import 'dart:ui' as ui;
55

6-
///the image data of /assets/material.png
7-
ui.Image material;
6+
import 'material.dart';
87

98
const _DIGITAL_ROW_SIZE = Size(14, 24);
109

11-
1210
class Number extends StatelessWidget {
1311
final int length;
1412

@@ -214,7 +212,8 @@ class _Material extends StatelessWidget {
214212
@override
215213
Widget build(BuildContext context) {
216214
return CustomPaint(
217-
foregroundPainter: _MaterialPainter(srcOffset, srcSize),
215+
foregroundPainter: _MaterialPainter(
216+
srcOffset, srcSize, GameMaterial.getMaterial(context)),
218217
child: SizedBox.fromSize(
219218
size: size,
220219
),
@@ -223,13 +222,15 @@ class _Material extends StatelessWidget {
223222
}
224223

225224
class _MaterialPainter extends CustomPainter {
226-
///offset to ajust the drawing
225+
///offset to adjust the drawing
227226
final Offset offset;
228227

229228
///the size we pick from [_material]
230229
final Size size;
231230

232-
_MaterialPainter(this.offset, this.size);
231+
final ui.Image material;
232+
233+
_MaterialPainter(this.offset, this.size, this.material);
233234

234235
Paint _paint = Paint();
235236

lib/material/material.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'dart:ui' as ui;
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:flutter/services.dart';
5+
6+
class GameMaterial extends StatefulWidget {
7+
final Widget child;
8+
9+
const GameMaterial({Key key, this.child}) : super(key: key);
10+
11+
@override
12+
_GameMaterialState createState() => _GameMaterialState();
13+
14+
static ui.Image getMaterial(BuildContext context) {
15+
final _GameMaterialState state =
16+
context.ancestorStateOfType(const TypeMatcher<_GameMaterialState>());
17+
assert(state != null, "can not find GameMaterial widget");
18+
return state.material;
19+
}
20+
}
21+
22+
class _GameMaterialState extends State<GameMaterial> {
23+
///the image data of /assets/material.png
24+
ui.Image material;
25+
26+
@override
27+
void initState() {
28+
super.initState();
29+
_doLoadMaterial();
30+
}
31+
32+
void _doLoadMaterial() async {
33+
if (material != null) {
34+
return;
35+
}
36+
final bytes = await rootBundle.load("assets/material.png");
37+
final codec = await ui.instantiateImageCodec(bytes.buffer.asUint8List());
38+
final frame = await codec.getNextFrame();
39+
setState(() {
40+
material = frame.image;
41+
});
42+
}
43+
44+
@override
45+
Widget build(BuildContext context) {
46+
return material == null ? Container() : widget.child;
47+
}
48+
}

lib/panel/screen.dart

Lines changed: 21 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import 'dart:math';
2-
import 'dart:ui' as ui;
32

43
import 'package:flutter/material.dart';
5-
import 'package:flutter/services.dart';
64
import 'package:tetris/gamer/gamer.dart';
75
import 'package:tetris/material/briks.dart';
8-
import 'package:tetris/material/images.dart';
6+
import 'package:tetris/material/material.dart';
97
import 'package:vector_math/vector_math_64.dart' as v;
108

119
import 'player_panel.dart';
@@ -14,67 +12,39 @@ import 'status_panel.dart';
1412
const Color SCREEN_BACKGROUND = Color(0xff9ead86);
1513

1614
/// screen H : W;
17-
class Screen extends StatefulWidget {
15+
class Screen extends StatelessWidget {
1816
///the with of screen
1917
final double width;
2018

2119
const Screen({Key key, @required this.width}) : super(key: key);
2220

2321
Screen.fromHeight(double height) : this(width: ((height - 6) / 2 + 6) / 0.6);
2422

25-
@override
26-
ScreenState createState() {
27-
return new ScreenState();
28-
}
29-
}
30-
31-
class ScreenState extends State<Screen> {
32-
@override
33-
void initState() {
34-
super.initState();
35-
_doLoadMaterial();
36-
}
37-
38-
void _doLoadMaterial() async {
39-
if (material != null) {
40-
return;
41-
}
42-
final bytes = await rootBundle.load("assets/material.png");
43-
final codec = await ui.instantiateImageCodec(bytes.buffer.asUint8List());
44-
final frame = await codec.getNextFrame();
45-
setState(() {
46-
material = frame.image;
47-
});
48-
}
49-
5023
@override
5124
Widget build(BuildContext context) {
5225
//play panel need 60%
53-
final playerPanelWidth = widget.width * 0.6;
54-
Widget screen;
55-
if (material != null) {
56-
screen = BrikSize(
57-
size: getBrikSizeForScreenWidth(playerPanelWidth),
58-
child: Row(
59-
children: <Widget>[
60-
PlayerPanel(width: playerPanelWidth),
61-
SizedBox(
62-
width: widget.width - playerPanelWidth,
63-
child: StatusPanel(),
64-
)
65-
],
66-
),
67-
);
68-
}
69-
26+
final playerPanelWidth = width * 0.6;
7027
return Shake(
7128
shake: GameState.of(context).states == GameStates.drop,
7229
child: SizedBox(
7330
height: (playerPanelWidth - 6) * 2 + 6,
74-
width: widget.width,
31+
width: width,
7532
child: Container(
7633
color: SCREEN_BACKGROUND,
77-
child: screen,
34+
child: GameMaterial(
35+
child: BrikSize(
36+
size: getBrikSizeForScreenWidth(playerPanelWidth),
37+
child: Row(
38+
children: <Widget>[
39+
PlayerPanel(width: playerPanelWidth),
40+
SizedBox(
41+
width: width - playerPanelWidth,
42+
child: StatusPanel(),
43+
)
44+
],
45+
),
46+
),
47+
),
7848
),
7949
),
8050
);
@@ -84,6 +54,7 @@ class ScreenState extends State<Screen> {
8454
class Shake extends StatefulWidget {
8555
final Widget child;
8656

57+
///true to shake screen vertically
8758
final bool shake;
8859

8960
const Shake({Key key, @required this.child, @required this.shake})
@@ -121,7 +92,7 @@ class _ShakeState extends State<Shake> with TickerProviderStateMixin {
12192
super.dispose();
12293
}
12394

124-
v.Vector3 getTranslation() {
95+
v.Vector3 _getTranslation() {
12596
double progress = _controller.value;
12697
double offset = sin(progress * pi) * 1.5;
12798
return v.Vector3(0, offset, 0.0);
@@ -130,7 +101,7 @@ class _ShakeState extends State<Shake> with TickerProviderStateMixin {
130101
@override
131102
Widget build(BuildContext context) {
132103
return Transform(
133-
transform: Matrix4.translation(getTranslation()),
104+
transform: Matrix4.translation(_getTranslation()),
134105
child: widget.child,
135106
);
136107
}

pubspec.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ dependencies:
1717
sdk: flutter
1818
flutter_localizations:
1919
sdk: flutter
20-
overlay_support:
21-
git:
22-
url: git://github.com/boyan01/overlay_support.git
20+
overlay_support: ^0.0.4
2321
audioplayers: ^0.8.0
2422

2523
dev_dependencies:

0 commit comments

Comments
 (0)