Showing
9 changed files
with
391 additions
and
101 deletions
1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" | 1 | <manifest xmlns:android="http://schemas.android.com/apk/res/android" |
2 | package="com.mofunsky.one_poem"> | 2 | package="com.mofunsky.one_poem"> |
3 | <application | 3 | <application |
4 | - android:label="one_poem" | 4 | + android:label="一言" |
5 | android:icon="@mipmap/ic_launcher"> | 5 | android:icon="@mipmap/ic_launcher"> |
6 | <activity | 6 | <activity |
7 | android:name=".MainActivity" | 7 | android:name=".MainActivity" | ... | ... |
... | @@ -10,7 +10,9 @@ class AccountRouter implements IRouterProvider{ | ... | @@ -10,7 +10,9 @@ class AccountRouter implements IRouterProvider{ |
10 | 10 | ||
11 | @override | 11 | @override |
12 | void initRouter(FluroRouter router) { | 12 | void initRouter(FluroRouter router) { |
13 | - router.define(accountPage, handler: Handler(handlerFunc: (_, __) => const AccountPage())); | 13 | + router.define(accountPage, handler: Handler(handlerFunc: (_, __) { |
14 | + return const AccountPage(isSelfPage: true,); | ||
15 | + })); | ||
14 | } | 16 | } |
15 | 17 | ||
16 | } | 18 | } | ... | ... |
1 | -import 'package:common_utils/common_utils.dart'; | ||
2 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
3 | -import 'package:one_poem/res/gaps.dart'; | 2 | +import 'package:one_poem/tiktok/style/style.dart'; |
4 | -import 'package:one_poem/res/resources.dart'; | ||
5 | -import 'package:one_poem/routers/fluro_navigator.dart'; | ||
6 | -import 'package:one_poem/util/image_utils.dart'; | ||
7 | -import 'package:one_poem/widgets/click_item.dart'; | ||
8 | import 'package:one_poem/widgets/my_app_bar.dart'; | 3 | import 'package:one_poem/widgets/my_app_bar.dart'; |
9 | -import 'package:one_poem/widgets/rise_number_text.dart'; | 4 | +import 'package:tapped/tapped.dart'; |
5 | +import 'package:flutter_gen/gen_l10n/one_poem_localizations.dart'; | ||
10 | 6 | ||
11 | -import '../account_router.dart'; | ||
12 | - | ||
13 | -/// design/6店铺-账户/index.html#artboard2 | ||
14 | class AccountPage extends StatefulWidget { | 7 | class AccountPage extends StatefulWidget { |
8 | + const AccountPage({ | ||
9 | + Key? key, | ||
10 | + this.canPop = false, | ||
11 | + this.onPop, | ||
12 | + this.isSelfPage, | ||
13 | + this.onSwitch, | ||
14 | + }) : super(key: key); | ||
15 | 15 | ||
16 | - const AccountPage({Key? key}) : super(key: key); | 16 | + final bool canPop; |
17 | + final bool? isSelfPage; | ||
18 | + final Function? onPop; | ||
19 | + final Function? onSwitch; | ||
17 | 20 | ||
18 | @override | 21 | @override |
19 | _AccountPageState createState() => _AccountPageState(); | 22 | _AccountPageState createState() => _AccountPageState(); |
... | @@ -22,106 +25,370 @@ class AccountPage extends StatefulWidget { | ... | @@ -22,106 +25,370 @@ class AccountPage extends StatefulWidget { |
22 | class _AccountPageState extends State<AccountPage> { | 25 | class _AccountPageState extends State<AccountPage> { |
23 | @override | 26 | @override |
24 | Widget build(BuildContext context) { | 27 | Widget build(BuildContext context) { |
25 | - return Scaffold( | 28 | + Widget likeButton = Container( |
26 | - appBar: const MyAppBar( | 29 | + color: ColorPlate.back1, |
27 | - centerTitle: '资金管理', | 30 | + child: Row( |
31 | + crossAxisAlignment: CrossAxisAlignment.start, | ||
32 | + mainAxisAlignment: MainAxisAlignment.end, | ||
33 | + children: const <Widget>[ | ||
34 | + Tapped( | ||
35 | + child: _UserRightButton( | ||
36 | + title: '钱包', | ||
37 | + ), | ||
38 | + ), | ||
39 | + ], | ||
40 | + ), | ||
41 | + ); | ||
42 | + Widget avatar = Container( | ||
43 | + height: 120 + MediaQuery.of(context).padding.top, | ||
44 | + padding: const EdgeInsets.only(left: 18), | ||
45 | + alignment: Alignment.bottomLeft, | ||
46 | + child: OverflowBox( | ||
47 | + alignment: Alignment.bottomLeft, | ||
48 | + minHeight: 20, | ||
49 | + maxHeight: 300, | ||
50 | + child: Container( | ||
51 | + height: 74, | ||
52 | + width: 74, | ||
53 | + margin: const EdgeInsets.only(bottom: 12), | ||
54 | + decoration: BoxDecoration( | ||
55 | + borderRadius: BorderRadius.circular(44), | ||
56 | + color: Colors.orange, | ||
57 | + border: Border.all( | ||
58 | + color: Colors.white, | ||
59 | + width: 1, | ||
60 | + ), | ||
61 | + ), | ||
62 | + child: ClipOval( | ||
63 | + child: Image.network( | ||
64 | + "https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif", | ||
65 | + fit: BoxFit.cover, | ||
66 | + ), | ||
67 | + ), | ||
28 | ), | 68 | ), |
29 | - body: SingleChildScrollView( | 69 | + ), |
70 | + ); | ||
71 | + Widget body = ListView( | ||
72 | + physics: const BouncingScrollPhysics( | ||
73 | + parent: AlwaysScrollableScrollPhysics(), | ||
74 | + ), | ||
75 | + children: <Widget>[ | ||
76 | + Container(height: 20), | ||
77 | + // 头像与关注 | ||
78 | + Stack( | ||
79 | + alignment: Alignment.bottomLeft, | ||
80 | + children: <Widget>[likeButton, avatar], | ||
81 | + ), | ||
82 | + Container( | ||
83 | + color: ColorPlate.back1, | ||
84 | + child: Column( | ||
85 | + children: <Widget>[ | ||
86 | + Container( | ||
87 | + padding: const EdgeInsets.only(left: 18), | ||
88 | + color: ColorPlate.back1, | ||
30 | child: Column( | 89 | child: Column( |
90 | + crossAxisAlignment: CrossAxisAlignment.start, | ||
31 | children: <Widget>[ | 91 | children: <Widget>[ |
32 | - Gaps.vGap5, | 92 | + const Text( |
33 | - _buildCard(), | 93 | + '@唐宋八大家TOP8', |
34 | - Gaps.vGap5, | 94 | + style: StandardTextStyle.big, |
35 | - ClickItem( | 95 | + ), |
36 | - title: '提现', | 96 | + Container(height: 8), |
37 | - onTap: () => NavigatorUtils.push(context, AccountRouter.accountPage),//TODO | 97 | + Text( |
98 | + '朴实无华,且枯燥', | ||
99 | + style: StandardTextStyle.smallWithOpacity.apply( | ||
100 | + color: Colors.white, | ||
38 | ), | 101 | ), |
39 | - ClickItem( | ||
40 | - title: '提现记录', | ||
41 | - onTap: () => NavigatorUtils.push(context, AccountRouter.accountPage),//TODO | ||
42 | ), | 102 | ), |
43 | - ClickItem( | 103 | + Container(height: 10), |
44 | - title: '提现密码', | 104 | + Row( |
45 | - onTap: () => NavigatorUtils.push(context, AccountRouter.accountPage),//TODO | 105 | + children: const <Widget>[ |
106 | + _UserTag(tag: '幽默'), | ||
107 | + _UserTag(tag: '机智'), | ||
108 | + _UserTag(tag: '枯燥'), | ||
109 | + _UserTag(tag: '狮子座'), | ||
110 | + ], | ||
46 | ), | 111 | ), |
112 | + Container(height: 10), | ||
47 | ], | 113 | ], |
48 | ), | 114 | ), |
49 | - ) | 115 | + ), |
116 | + Container( | ||
117 | + color: ColorPlate.back1, | ||
118 | + padding: const EdgeInsets.symmetric( | ||
119 | + horizontal: 8, | ||
120 | + vertical: 2, | ||
121 | + ), | ||
122 | + child: Row( | ||
123 | + mainAxisAlignment: MainAxisAlignment.start, | ||
124 | + crossAxisAlignment: CrossAxisAlignment.center, | ||
125 | + children: const <Widget>[ | ||
126 | + TextGroup('356', '关注'), | ||
127 | + TextGroup('145万', '粉丝'), | ||
128 | + TextGroup('1423万', '获赞'), | ||
129 | + ], | ||
130 | + ), | ||
131 | + ), | ||
132 | + Container( | ||
133 | + height: 10, | ||
134 | + margin: const EdgeInsets.symmetric(horizontal: 12), | ||
135 | + decoration: BoxDecoration( | ||
136 | + border: Border( | ||
137 | + bottom: BorderSide( | ||
138 | + color: Colors.white.withOpacity(0.1), | ||
139 | + ), | ||
140 | + ), | ||
141 | + ), | ||
142 | + ), | ||
143 | + const _UserVideoTable(), | ||
144 | + ], | ||
145 | + ), | ||
146 | + ), | ||
147 | + ], | ||
50 | ); | 148 | ); |
149 | + return Scaffold( | ||
150 | + appBar: const MyAppBar( | ||
151 | + centerTitle: '我在', | ||
152 | + ), | ||
153 | + body: Container( | ||
154 | + decoration: const BoxDecoration( | ||
155 | + gradient: LinearGradient( | ||
156 | + begin: Alignment.topCenter, | ||
157 | + colors: <Color>[ | ||
158 | + Colors.orange, | ||
159 | + Colors.red, | ||
160 | + ], | ||
161 | + ), | ||
162 | + ), | ||
163 | + child: Stack( | ||
164 | + alignment: Alignment.topCenter, | ||
165 | + children: <Widget>[ | ||
166 | + Container( | ||
167 | + margin: const EdgeInsets.only(top: 400), | ||
168 | + height: double.infinity, | ||
169 | + width: double.infinity, | ||
170 | + color: ColorPlate.back1, | ||
171 | + ), | ||
172 | + body, | ||
173 | + ], | ||
174 | + ), | ||
175 | + )); | ||
51 | } | 176 | } |
177 | +} | ||
52 | 178 | ||
53 | - Widget _buildCard() { | 179 | +class _UserRightButton extends StatelessWidget { |
54 | - return AspectRatio( | 180 | + const _UserRightButton({ |
55 | - aspectRatio: 1.85, | 181 | + Key? key, |
56 | - child: Container( | 182 | + required this.title, |
57 | - margin: const EdgeInsets.symmetric(horizontal: 6.0), | 183 | + }) : super(key: key); |
58 | - padding: const EdgeInsets.all(6.0), | 184 | + |
185 | + final String title; | ||
186 | + | ||
187 | + @override | ||
188 | + Widget build(BuildContext context) { | ||
189 | + return Container( | ||
190 | + padding: const EdgeInsets.symmetric( | ||
191 | + vertical: 6, | ||
192 | + horizontal: 20, | ||
193 | + ), | ||
194 | + margin: const EdgeInsets.all(8), | ||
195 | + alignment: Alignment.center, | ||
196 | + child: Text( | ||
197 | + title, | ||
198 | + style: const TextStyle(color: ColorPlate.orange), | ||
199 | + ), | ||
59 | decoration: BoxDecoration( | 200 | decoration: BoxDecoration( |
60 | - image: DecorationImage( | 201 | + border: Border.all(color: ColorPlate.orange), |
61 | - image: ImageUtils.getAssetImage('account/bg'), | 202 | + borderRadius: BorderRadius.circular(4), |
62 | - fit: BoxFit.fill, | ||
63 | ), | 203 | ), |
204 | + ); | ||
205 | + } | ||
206 | +} | ||
207 | + | ||
208 | +class _UserTag extends StatelessWidget { | ||
209 | + final String? tag; | ||
210 | + const _UserTag({ | ||
211 | + Key? key, | ||
212 | + this.tag, | ||
213 | + }) : super(key: key); | ||
214 | + | ||
215 | + @override | ||
216 | + Widget build(BuildContext context) { | ||
217 | + return Container( | ||
218 | + margin: const EdgeInsets.symmetric(horizontal: 4), | ||
219 | + padding: const EdgeInsets.symmetric( | ||
220 | + vertical: 2, | ||
221 | + horizontal: 4, | ||
64 | ), | 222 | ), |
65 | - child: Column( | 223 | + decoration: BoxDecoration( |
224 | + border: Border.all( | ||
225 | + color: Colors.white.withOpacity(0.3), | ||
226 | + ), | ||
227 | + borderRadius: BorderRadius.circular(4), | ||
228 | + ), | ||
229 | + child: Text( | ||
230 | + tag ?? '标签', | ||
231 | + style: StandardTextStyle.smallWithOpacity, | ||
232 | + ), | ||
233 | + ); | ||
234 | + } | ||
235 | +} | ||
236 | + | ||
237 | +class _UserVideoTable extends StatelessWidget { | ||
238 | + const _UserVideoTable({ | ||
239 | + Key? key, | ||
240 | + }) : super(key: key); | ||
241 | + | ||
242 | + @override | ||
243 | + Widget build(BuildContext context) { | ||
244 | + return Column( | ||
66 | children: <Widget>[ | 245 | children: <Widget>[ |
67 | - const _AccountMoney( | 246 | + Container( |
68 | - title: '当前余额(元)', | 247 | + color: ColorPlate.back1, |
69 | - money: '30.12', | 248 | + padding: const EdgeInsets.symmetric( |
70 | - alignment: MainAxisAlignment.end, | 249 | + vertical: 12, |
71 | - moneyTextStyle: TextStyle(color: Colors.white, fontSize: 32.0, fontWeight: FontWeight.bold, fontFamily: 'RobotoThin'), | ||
72 | ), | 250 | ), |
73 | - Expanded( | ||
74 | child: Row( | 251 | child: Row( |
75 | - children: const <Widget>[ | 252 | + mainAxisAlignment: MainAxisAlignment.center, |
76 | - _AccountMoney(title: '累计结算金额', money: '20000'), | 253 | + crossAxisAlignment: CrossAxisAlignment.center, |
77 | - _AccountMoney(title: '累计发放佣金', money: '0.02'), | 254 | + children: <Widget>[ |
255 | + _PointSelectTextButton( | ||
256 | + true, | ||
257 | + OnePoemLocalizations.of(context) | ||
258 | + .onePoemBottomNavigationBarItemTitle, | ||
259 | + ), | ||
260 | + _PointSelectTextButton( | ||
261 | + false, | ||
262 | + OnePoemLocalizations.of(context) | ||
263 | + .timelineBottomNavigationBarItemTitle), | ||
264 | + _PointSelectTextButton( | ||
265 | + false, | ||
266 | + OnePoemLocalizations.of(context) | ||
267 | + .categoryBottomNavigationBarItemTitle), | ||
78 | ], | 268 | ], |
79 | ), | 269 | ), |
80 | ), | 270 | ), |
271 | + Row( | ||
272 | + children: const <Widget>[ | ||
273 | + _SmallVideo(), | ||
274 | + _SmallVideo(), | ||
275 | + _SmallVideo(), | ||
81 | ], | 276 | ], |
82 | ), | 277 | ), |
278 | + Row( | ||
279 | + children: const <Widget>[ | ||
280 | + _SmallVideo(), | ||
281 | + _SmallVideo(), | ||
282 | + _SmallVideo(), | ||
283 | + ], | ||
83 | ), | 284 | ), |
285 | + ], | ||
84 | ); | 286 | ); |
85 | } | 287 | } |
86 | } | 288 | } |
87 | 289 | ||
88 | -class _AccountMoney extends StatelessWidget { | 290 | +class _SmallVideo extends StatelessWidget { |
89 | - | 291 | + const _SmallVideo({ |
90 | - const _AccountMoney({ | ||
91 | Key? key, | 292 | Key? key, |
92 | - required this.title, | 293 | + }) : super(key: key); |
93 | - required this.money, | ||
94 | - this.alignment, | ||
95 | - this.moneyTextStyle | ||
96 | - }): super(key: key); | ||
97 | 294 | ||
295 | + @override | ||
296 | + Widget build(BuildContext context) { | ||
297 | + return Expanded( | ||
298 | + child: AspectRatio( | ||
299 | + aspectRatio: 3 / 4.0, | ||
300 | + child: Container( | ||
301 | + decoration: BoxDecoration( | ||
302 | + color: ColorPlate.darkGray, | ||
303 | + border: Border.all(color: Colors.black), | ||
304 | + ), | ||
305 | + alignment: Alignment.center, | ||
306 | + child: Text( | ||
307 | + '一言', | ||
308 | + style: TextStyle( | ||
309 | + color: Colors.white.withOpacity(0.1), | ||
310 | + fontSize: 18, | ||
311 | + fontWeight: FontWeight.w900, | ||
312 | + ), | ||
313 | + ), | ||
314 | + ), | ||
315 | + ), | ||
316 | + ); | ||
317 | + } | ||
318 | +} | ||
319 | + | ||
320 | +class _PointSelectTextButton extends StatelessWidget { | ||
321 | + final bool isSelect; | ||
98 | final String title; | 322 | final String title; |
99 | - final String money; | 323 | + final Function? onTap; |
100 | - final MainAxisAlignment? alignment; | 324 | + const _PointSelectTextButton( |
101 | - final TextStyle? moneyTextStyle; | 325 | + this.isSelect, |
326 | + this.title, { | ||
327 | + Key? key, | ||
328 | + this.onTap, | ||
329 | + }) : super(key: key); | ||
102 | 330 | ||
103 | @override | 331 | @override |
104 | Widget build(BuildContext context) { | 332 | Widget build(BuildContext context) { |
105 | return Expanded( | 333 | return Expanded( |
106 | - child: MergeSemantics( | 334 | + child: Row( |
107 | - child: Column( | 335 | + mainAxisAlignment: MainAxisAlignment.center, |
108 | - mainAxisAlignment: alignment ?? MainAxisAlignment.center, | ||
109 | children: <Widget>[ | 336 | children: <Widget>[ |
110 | - /// 横向撑开Column,扩大语义区域 | 337 | + isSelect |
111 | - const SizedBox(width: double.infinity), | 338 | + ? Container( |
112 | - Text(title, style: const TextStyle(color: Colours.text_disabled, fontSize: Dimens.font_sp12)), | 339 | + width: 6, |
113 | - Gaps.vGap8, | 340 | + height: 6, |
114 | - RiseNumberText( | 341 | + decoration: BoxDecoration( |
115 | - NumUtil.getDoubleByValueStr(money) ?? 0, | 342 | + color: ColorPlate.orange, |
116 | - style: moneyTextStyle ?? const TextStyle( | 343 | + borderRadius: BorderRadius.circular(3), |
117 | - color: Colours.text_disabled, | 344 | + ), |
118 | - fontSize: Dimens.font_sp14, | ||
119 | - fontWeight: FontWeight.bold, | ||
120 | - fontFamily: 'RobotoThin' | ||
121 | ) | 345 | ) |
346 | + : Container(), | ||
347 | + Container( | ||
348 | + padding: const EdgeInsets.only(left: 2), | ||
349 | + child: Text( | ||
350 | + title, | ||
351 | + style: isSelect | ||
352 | + ? StandardTextStyle.small | ||
353 | + : StandardTextStyle.smallWithOpacity, | ||
122 | ), | 354 | ), |
355 | + ) | ||
123 | ], | 356 | ], |
124 | ), | 357 | ), |
358 | + ); | ||
359 | + } | ||
360 | +} | ||
361 | + | ||
362 | +class TextGroup extends StatelessWidget { | ||
363 | + final String title, tag; | ||
364 | + final Color? color; | ||
365 | + | ||
366 | + const TextGroup( | ||
367 | + this.title, | ||
368 | + this.tag, { | ||
369 | + Key? key, | ||
370 | + this.color, | ||
371 | + }) : super(key: key); | ||
372 | + | ||
373 | + @override | ||
374 | + Widget build(BuildContext context) { | ||
375 | + return Container( | ||
376 | + padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 8), | ||
377 | + child: Row( | ||
378 | + crossAxisAlignment: CrossAxisAlignment.end, | ||
379 | + children: <Widget>[ | ||
380 | + Text( | ||
381 | + title, | ||
382 | + style: StandardTextStyle.big.apply(color: color), | ||
383 | + ), | ||
384 | + Container(width: 4), | ||
385 | + Text( | ||
386 | + tag, | ||
387 | + style: StandardTextStyle.smallWithOpacity.apply( | ||
388 | + color: color?.withOpacity(0.6), | ||
389 | + ), | ||
390 | + ), | ||
391 | + ], | ||
125 | ), | 392 | ), |
126 | ); | 393 | ); |
127 | } | 394 | } | ... | ... |
1 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
2 | +import 'package:one_poem/account/page/account_page.dart'; | ||
2 | import 'package:one_poem/goods/page/goods_page.dart'; | 3 | import 'package:one_poem/goods/page/goods_page.dart'; |
3 | import 'package:one_poem/poem/page/poem_page.dart'; | 4 | import 'package:one_poem/poem/page/poem_page.dart'; |
4 | import 'package:one_poem/res/resources.dart'; | 5 | import 'package:one_poem/res/resources.dart'; |
... | @@ -45,7 +46,7 @@ class _HomeState extends State<Home> with RestorationMixin { | ... | @@ -45,7 +46,7 @@ class _HomeState extends State<Home> with RestorationMixin { |
45 | const PoemPage(), | 46 | const PoemPage(), |
46 | const GoodsPage(), | 47 | const GoodsPage(), |
47 | const NotFoundPage(), | 48 | const NotFoundPage(), |
48 | - const ShopPage(), | 49 | + const AccountPage(), |
49 | ]; | 50 | ]; |
50 | } | 51 | } |
51 | 52 | ... | ... |
... | @@ -46,13 +46,18 @@ Future<void> main() async { | ... | @@ -46,13 +46,18 @@ Future<void> main() async { |
46 | /// sp初始化 | 46 | /// sp初始化 |
47 | await SpUtil.getInstance(); | 47 | await SpUtil.getInstance(); |
48 | 48 | ||
49 | + WidgetsFlutterBinding.ensureInitialized(); | ||
50 | + SystemChrome.setPreferredOrientations( | ||
51 | + [DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); | ||
52 | + | ||
49 | /// 1.22 预览功能: 在输入频率与显示刷新率不匹配情况下提供平滑的滚动效果 | 53 | /// 1.22 预览功能: 在输入频率与显示刷新率不匹配情况下提供平滑的滚动效果 |
50 | // GestureBinding.instance?.resamplingEnabled = true; | 54 | // GestureBinding.instance?.resamplingEnabled = true; |
51 | /// 异常处理 | 55 | /// 异常处理 |
52 | handleError(() => runApp(MyApp())); | 56 | handleError(() => runApp(MyApp())); |
53 | 57 | ||
54 | /// 隐藏状态栏。为启动页、引导页设置。完成后修改回显示状态栏。 | 58 | /// 隐藏状态栏。为启动页、引导页设置。完成后修改回显示状态栏。 |
55 | - SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.bottom]); | 59 | + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, |
60 | + overlays: [SystemUiOverlay.bottom]); | ||
56 | // TODO(weilu): 启动体验不佳。状态栏、导航栏在冷启动开始的一瞬间为黑色,且无法通过隐藏、修改颜色等方式进行处理。。。 | 61 | // TODO(weilu): 启动体验不佳。状态栏、导航栏在冷启动开始的一瞬间为黑色,且无法通过隐藏、修改颜色等方式进行处理。。。 |
57 | // 相关问题跟踪:https://github.com/flutter/flutter/issues/73351 | 62 | // 相关问题跟踪:https://github.com/flutter/flutter/issues/73351 |
58 | } | 63 | } |
... | @@ -108,10 +113,7 @@ class MyApp extends StatelessWidget { | ... | @@ -108,10 +113,7 @@ class MyApp extends StatelessWidget { |
108 | 113 | ||
109 | quickActions.setShortcutItems(<ShortcutItem>[ | 114 | quickActions.setShortcutItems(<ShortcutItem>[ |
110 | const ShortcutItem( | 115 | const ShortcutItem( |
111 | - type: 'demo', | 116 | + type: 'demo', localizedTitle: 'Demo', icon: 'flutter_dash_black'), |
112 | - localizedTitle: 'Demo', | ||
113 | - icon: 'flutter_dash_black' | ||
114 | - ), | ||
115 | ]); | 117 | ]); |
116 | } | 118 | } |
117 | } | 119 | } |
... | @@ -124,7 +126,8 @@ class MyApp extends StatelessWidget { | ... | @@ -124,7 +126,8 @@ class MyApp extends StatelessWidget { |
124 | ChangeNotifierProvider(create: (_) => LocaleProvider()) | 126 | ChangeNotifierProvider(create: (_) => LocaleProvider()) |
125 | ], | 127 | ], |
126 | child: Consumer2<ThemeProvider, LocaleProvider>( | 128 | child: Consumer2<ThemeProvider, LocaleProvider>( |
127 | - builder: (_, ThemeProvider provider, LocaleProvider localeProvider, __) { | 129 | + builder: |
130 | + (_, ThemeProvider provider, LocaleProvider localeProvider, __) { | ||
128 | return _buildMaterialApp(provider, localeProvider); | 131 | return _buildMaterialApp(provider, localeProvider); |
129 | }, | 132 | }, |
130 | ), | 133 | ), |
... | @@ -133,14 +136,15 @@ class MyApp extends StatelessWidget { | ... | @@ -133,14 +136,15 @@ class MyApp extends StatelessWidget { |
133 | /// Toast 配置 | 136 | /// Toast 配置 |
134 | return OKToast( | 137 | return OKToast( |
135 | backgroundColor: Colors.black54, | 138 | backgroundColor: Colors.black54, |
136 | - textPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), | 139 | + textPadding: |
140 | + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), | ||
137 | radius: 20.0, | 141 | radius: 20.0, |
138 | position: ToastPosition.bottom, | 142 | position: ToastPosition.bottom, |
139 | - child: app | 143 | + child: app); |
140 | - ); | ||
141 | } | 144 | } |
142 | 145 | ||
143 | - Widget _buildMaterialApp(ThemeProvider provider, LocaleProvider localeProvider) { | 146 | + Widget _buildMaterialApp( |
147 | + ThemeProvider provider, LocaleProvider localeProvider) { | ||
144 | return MaterialApp( | 148 | return MaterialApp( |
145 | title: 'Flutter Deer', | 149 | title: 'Flutter Deer', |
146 | // showPerformanceOverlay: true, //显示性能标签 | 150 | // showPerformanceOverlay: true, //显示性能标签 | ... | ... |
1 | import 'package:flutter/material.dart'; | 1 | import 'package:flutter/material.dart'; |
2 | +import 'package:one_poem/tiktok/style/style.dart'; | ||
2 | import 'package:one_poem/widgets/my_app_bar.dart'; | 3 | import 'package:one_poem/widgets/my_app_bar.dart'; |
3 | 4 | ||
4 | class PoemDetailPage extends StatefulWidget { | 5 | class PoemDetailPage extends StatefulWidget { |
5 | 6 | ||
6 | const PoemDetailPage({ | 7 | const PoemDetailPage({ |
7 | Key? key, | 8 | Key? key, |
8 | - this.isAccessibilityTest = false, | 9 | + this.onPop, |
10 | + required this.poemId, | ||
9 | }) : super(key : key); | 11 | }) : super(key : key); |
10 | 12 | ||
11 | - final bool isAccessibilityTest; | 13 | + final int poemId; |
14 | + final Function? onPop; | ||
12 | 15 | ||
13 | @override | 16 | @override |
14 | _PoemDetailPageState createState() => _PoemDetailPageState(); | 17 | _PoemDetailPageState createState() => _PoemDetailPageState(); |
... | @@ -17,11 +20,27 @@ class PoemDetailPage extends StatefulWidget { | ... | @@ -17,11 +20,27 @@ class PoemDetailPage extends StatefulWidget { |
17 | class _PoemDetailPageState extends State<PoemDetailPage>{ | 20 | class _PoemDetailPageState extends State<PoemDetailPage>{ |
18 | @override | 21 | @override |
19 | Widget build(BuildContext context) { | 22 | Widget build(BuildContext context) { |
20 | - return const Scaffold( | 23 | + return Scaffold( |
21 | - appBar: MyAppBar( | 24 | + appBar: const MyAppBar( |
22 | - title: '一言|译解|临境', | 25 | + title: '一言', |
26 | + ), | ||
27 | + body: Container( | ||
28 | + decoration: const BoxDecoration( | ||
29 | + gradient: LinearGradient( | ||
30 | + begin: Alignment.topCenter, | ||
31 | + colors: <Color>[ | ||
32 | + Colors.black, | ||
33 | + Colors.black, | ||
34 | + ], | ||
35 | + ), | ||
36 | + ), | ||
37 | + child: Stack( | ||
38 | + alignment: Alignment.topCenter, | ||
39 | + children: <Widget>[ | ||
40 | + Text("题 破山寺后禅院"), | ||
41 | + ], | ||
42 | + ), | ||
23 | ), | 43 | ), |
24 | - body: Text("题 破山此后禅院"), | ||
25 | ); | 44 | ); |
26 | } | 45 | } |
27 | } | 46 | } |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -13,6 +13,8 @@ import 'package:one_poem/tiktok/widgets/tiktok_video_button_column.dart'; | ... | @@ -13,6 +13,8 @@ import 'package:one_poem/tiktok/widgets/tiktok_video_button_column.dart'; |
13 | import 'package:one_poem/tiktok/widgets/tiktok_video_poem.dart'; | 13 | import 'package:one_poem/tiktok/widgets/tiktok_video_poem.dart'; |
14 | import 'package:video_player/video_player.dart'; | 14 | import 'package:video_player/video_player.dart'; |
15 | 15 | ||
16 | +import 'poem_detail.dart'; | ||
17 | + | ||
16 | class PoemPage extends StatefulWidget { | 18 | class PoemPage extends StatefulWidget { |
17 | const PoemPage({Key? key}) : super(key: key); | 19 | const PoemPage({Key? key}) : super(key: key); |
18 | 20 | ||
... | @@ -100,12 +102,10 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -100,12 +102,10 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
100 | }, | 102 | }, |
101 | ); | 103 | ); |
102 | 104 | ||
103 | - var userPage = UserPage( | 105 | + var detailPage = PoemDetailPage( |
104 | - isSelfPage: false, | 106 | + onPop: (){ |
105 | - canPop: true, | ||
106 | - onPop: () { | ||
107 | tkController.animateToMiddle(); | 107 | tkController.animateToMiddle(); |
108 | - }, | 108 | + }, poemId: 1, |
109 | ); | 109 | ); |
110 | var searchPage = SearchPage( | 110 | var searchPage = SearchPage( |
111 | onPop: tkController.animateToMiddle, | 111 | onPop: tkController.animateToMiddle, |
... | @@ -116,7 +116,7 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { | ... | @@ -116,7 +116,7 @@ class _PoemPageState extends State<PoemPage> with WidgetsBindingObserver { |
116 | controller: tkController, | 116 | controller: tkController, |
117 | header: header, | 117 | header: header, |
118 | leftPage: searchPage, | 118 | leftPage: searchPage, |
119 | - rightPage: userPage, | 119 | + rightPage: detailPage, |
120 | enableGesture: true, | 120 | enableGesture: true, |
121 | page: Stack( | 121 | page: Stack( |
122 | children: <Widget>[ | 122 | children: <Widget>[ | ... | ... |
1 | import 'package:fluro/fluro.dart'; | 1 | import 'package:fluro/fluro.dart'; |
2 | import 'package:one_poem/routers/i_router.dart'; | 2 | import 'package:one_poem/routers/i_router.dart'; |
3 | 3 | ||
4 | -import 'page/poem_detail.dart'; | ||
5 | import 'page/poem_page.dart'; | 4 | import 'page/poem_page.dart'; |
6 | 5 | ||
7 | class PoemRouter implements IRouterProvider{ | 6 | class PoemRouter implements IRouterProvider{ |
8 | 7 | ||
9 | static String poemPage = '/poem'; | 8 | static String poemPage = '/poem'; |
10 | - static String poemDetail = '/poem/detail'; | ||
11 | 9 | ||
12 | @override | 10 | @override |
13 | void initRouter(FluroRouter router) { | 11 | void initRouter(FluroRouter router) { |
14 | router.define(poemPage, handler: Handler(handlerFunc: (_, __) => const PoemPage())); | 12 | router.define(poemPage, handler: Handler(handlerFunc: (_, __) => const PoemPage())); |
15 | - router.define(poemDetail, handler: Handler(handlerFunc: (_, __) => const PoemDetailPage())); | ||
16 | } | 13 | } |
17 | 14 | ||
18 | } | 15 | } | ... | ... |
... | @@ -13,7 +13,7 @@ class UserPage extends StatefulWidget { | ... | @@ -13,7 +13,7 @@ class UserPage extends StatefulWidget { |
13 | Key? key, | 13 | Key? key, |
14 | this.canPop = false, | 14 | this.canPop = false, |
15 | this.onPop, | 15 | this.onPop, |
16 | - required this.isSelfPage, | 16 | + this.isSelfPage = false, |
17 | this.onSwitch, | 17 | this.onSwitch, |
18 | }) : super(key: key); | 18 | }) : super(key: key); |
19 | 19 | ... | ... |
-
Please register or login to post a comment