123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434 |
- import 'dart:convert';
- import 'dart:math';
- import 'package:cached_network_image/cached_network_image.dart';
- import 'package:flutter/cupertino.dart';
- import 'package:flutter/material.dart';
- import 'package:flutter_easyrefresh/easy_refresh.dart';
- import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
- import 'package:provider/provider.dart';
- import 'package:sport/bean/achievement_info.dart';
- import 'package:sport/bean/rank_game_info.dart';
- import 'package:sport/bean/user.dart';
- import 'package:sport/provider/lib/provider_widget.dart';
- import 'package:sport/provider/lib/simple_model.dart';
- import 'package:sport/provider/user_model.dart';
- import 'package:sport/router/navigator_util.dart';
- import 'package:sport/router/routes.dart';
- import 'package:sport/services/api/inject_api.dart';
- import 'package:sport/widgets/appbar.dart';
- import 'package:sport/widgets/box.dart';
- import 'package:sport/widgets/error.dart';
- import 'package:sport/widgets/image.dart';
- import 'package:sport/widgets/loading.dart';
- import 'package:sport/widgets/misc.dart';
- import 'package:sport/widgets/space.dart';
- import 'achievement_page.dart';
- class LevelPage extends StatefulWidget {
- @override
- State<StatefulWidget> createState() => _PageState();
- }
- class _PageState extends State<LevelPage> with InjectLoginApi {
- SimpleModel _model;
- bool _max = false;
- ScrollController _controller;
- int _brightness = 0;
- @override
- void initState() {
- super.initState();
- _model = SimpleModel(
- (page) async => [(await loginApi.getAchievementInfo()).data]);
- // _controller = ScrollController()
- // ..addListener(() {
- //// print(
- //// "[_controller.position.pixels] -------------------------- ${_controller.position.pixels}");
- // print("[_brightness]--------------------------$_brightness");
- // if (_controller.position.pixels >= 70) {
- // if (_brightness == 0) {
- // setState(() {
- // _brightness = 1;
- // });
- // }
- // } else {
- // if (_brightness == 1) {
- // setState(() {
- // _brightness = 0;
- // });
- // }
- // }
- // });
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Color(0xff241D19),
- body: Stack(
- children: <Widget>[
- Positioned(
- top: -100,
- left: 0,
- child: Container(
- width: MediaQuery.of(context).size.width,
- height: 373.0,
- decoration: BoxDecoration(
- image: DecorationImage(
- image: AssetImage("lib/assets/img/mylevel_bg.png"),
- fit: BoxFit.contain)),
- )),
- ProviderWidget<SimpleModel>(
- model: _model,
- onModelReady: (model) => model.initData(),
- builder: (_, model, __) {
- AchievementInfoData _data =
- model.list.isNotEmpty ? model.list.first : null;
- return EasyRefresh.builder(
- controller: model.refreshController,
- enableControlFinishRefresh: true,
- enableControlFinishLoad: true,
- onRefresh: () => model.refresh(),
- header: buildClassicalHeader(),
- builder: (context, physics, header, footer) {
- return CustomScrollView(
- controller: _controller,
- physics: physics,
- slivers: <Widget>[
- buildSliverAppBar(
- context,
- "我的等级",
- backgroundColor: _brightness == 0
- ? Color(0x00000000)
- : Color(0xffffffff),
- brightness: _brightness == 0 ? 1 : 0,
- textStyle: _brightness == 0
- ? TextStyle(
- fontWeight: FontWeight.w600,
- fontSize: 18.0,
- color: Color(0xffffffff))
- : TextStyle(
- fontWeight: FontWeight.w600,
- fontSize: 18.0,
- color: Color(0xff333333)),
- whiteBackButton: _brightness == 0 ? true : false,
- canBack: _brightness == 0 ? false : true,
- ),
- // header,
- if (model.isBusy)
- SliverToBoxAdapter(
- child: RequestLoadingWidget(),
- ),
- if (model.isIdle && _data != null)
- SliverToBoxAdapter(
- child: BoxWidget(
- body: Column(
- children: <Widget>[
- Padding(
- padding: const EdgeInsets.only(bottom: 8.0),
- child: Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
- children: <Widget>[
- Row(
- children: <Widget>[
- Text(
- "积分:",
- style: Theme.of(context)
- .textTheme
- .subtitle1,
- ),
- Space(
- width: 5.0,
- ),
- Text(
- '${_data.exp}',
- style: TextStyle(
- fontSize: 14.0,
- color: Color(0xffFFC400)),
- )
- ],
- ),
- InkWell(
- child: Row(
- children: <Widget>[
- Padding(
- child: Text(
- "积分商城",
- style: Theme.of(context)
- .textTheme
- .bodyText1,
- ),
- padding: EdgeInsets.only(right: 5.0),
- ),
- arrowRight4()
- ],
- ),
- onTap: () {
- NavigatorUtil.go(
- context, Routes.scoreShopPage);
- },
- )
- ],
- ),
- ),
- Padding(
- padding: const EdgeInsets.only(
- top: 16.0, bottom: 8.0),
- child: Container(
- child: CachedNetworkImage(
- width: 130.0,
- height: 130.0,
- imageUrl: _data.level.logo ?? "",fit: BoxFit.contain,))),
- Text(
- "Lv.${_data.level.level}",
- style: Theme.of(context).textTheme.headline3,
- ),
- Space(
- height: 24,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.end,
- children: <Widget>[
- Row(
- children: <Widget>[
- Text(
- "${_data.exp}",
- style: TextStyle(
- fontSize: 11,
- color: Theme.of(context).accentColor),
- ),
- Text("/${_data.exp + _data.nextLevelExp}",
- style: TextStyle(fontSize: 11)),
- ],
- ),
- ],
- ),
- Space(
- height: 2,
- ),
- ClipRRect(
- borderRadius: BorderRadius.circular(10),
- child: Container(
- child: CustomPaint(
- painter: _ProgressBar(
- _data.exp /
- (_data.nextLevelExp + _data.exp),
- ),
- child: Container(
- height: 12,
- ),
- ),
- // height: 12,
- ),
- ),
- Space(
- height: 8,
- ),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: <Widget>[
- Row(
- children: <Widget>[
- Text("经验值:",
- style: Theme.of(context)
- .textTheme
- .subtitle1),
- Space(
- width: 2.0,
- ),
- Text(
- "${_data.exp}",
- style: Theme.of(context)
- .textTheme
- .subtitle1
- .copyWith(
- color: Theme.of(context)
- .accentColor),
- ),
- ],
- ),
- Text(
- "再获得 ${_data.nextLevelExp} 经验可升到下一段",
- style: Theme.of(context).textTheme.bodyText1,
- ),
- ],
- ),
- Space(height: 10.0,),
- ],
- ))),
- if (model.isIdle && _data != null)
- SliverToBoxAdapter(
- child: BoxWidget(
- body: Column(
- children: <Widget>[
- Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
- children: <Widget>[
- Text(
- "我的成就",
- style:
- Theme.of(context).textTheme.headline3,
- ),
- if (_data.getAchievementList.length > -1 ||
- _max)
- InkWell(
- onTap: () {
- // setState(() {
- // _max = true;
- // });
- // NavigatorUtil.go(context, "achievement");
- NavigatorUtil.go(context,
- "${Routes.achievement}?data=${Uri.encodeComponent(json.encode(_data))}");
- },
- child: Row(
- children: <Widget>[
- Text(
- "查看全部 ",
- style: Theme.of(context)
- .textTheme
- .bodyText1,
- ),
- arrowRight4()
- ],
- ),
- ),
- ],
- ),
- Space(height: 10.0,),
- if (_data.getAchievementList.length == 0)
- Padding(
- padding: const EdgeInsets.all(30.0),
- child: Column(
- children: <Widget>[
- Image.asset(
- "lib/assets/img/${RequestErrorWidget.ASSETS_NO_RANK}"),
- Padding(
- padding: const EdgeInsets.fromLTRB(
- 0, 12, 0, 12),
- child: Text(
- "还未获得任何成就",
- style: Theme.of(context)
- .textTheme
- .bodyText2,
- ),
- ),
- ],
- )),
- if (_data.getAchievementList.length > 0)
- Padding(
- padding:
- EdgeInsets.only(top: 16.0,bottom: 0.0),
- child: StaggeredGridView.countBuilder(
- padding: EdgeInsets.zero,
- shrinkWrap: true,
- physics: NeverScrollableScrollPhysics(),
- crossAxisCount: 4,
- itemCount: _max
- ? _data.getAchievementList.length
- : min(4,
- _data.getAchievementList.length),
- itemBuilder:
- (BuildContext context, int index) =>
- achievementWidget(
- context,
- _data.getAchievementList[index],
- isRadius: false,
- ),
- mainAxisSpacing: 12.0,
- crossAxisSpacing: 12.0,
- staggeredTileBuilder: (int index) =>
- StaggeredTile.fit(1),
- ),
- ),
- // Center(
- // child: Padding(
- // padding: const EdgeInsets.all(1.0),
- // child: Row(
- // children: <Widget>[
- // Expanded(
- // child: Divider(
- // endIndent: 20.0,
- // ),
- // ),
- // Text("未获得成就", style: Theme.of(context).textTheme.bodyText1),
- // Expanded(
- // child: Divider(
- // indent: 20.0,
- // ),
- // ),
- // ],
- // ),
- // ),
- // ),
- // getList(_data)
- ],
- ),
- ),
- ),
- ],
- );
- });
- },
- )
- ],
- ));
- }
- }
- class _ProgressBar extends CustomPainter {
- final Paint _paint = Paint()
- ..color = Color(0xffeeeeee)
- ..isAntiAlias = true;
- final Paint _indicatorPaint = Paint()
- ..color = Color(0xffFFC400)
- ..isAntiAlias = true;
- double _paddingBar = 2;
- double percent;
- _ProgressBar(this.percent);
- @override
- void paint(Canvas canvas, Size size) {
- double indicator = size.width * min(1.0, this.percent);
- canvas.save();
- var rect = Rect.fromLTRB(0, size.height - 13, size.width, size.height);
- canvas.clipRRect(
- RRect.fromRectAndRadius(rect, Radius.circular(size.height / 2)),
- doAntiAlias: true);
- canvas.drawRect(rect, _paint);
- Paint _valuePaint = Paint()
- ..shader = LinearGradient(
- begin: Alignment.centerLeft,
- end: Alignment.centerRight,
- colors: <Color>[Color(0xffFFE600), Color(0xffFF9100)],
- ).createShader(rect);
- canvas.drawRect(
- Rect.fromLTRB(
- 0, size.height - 13, size.width * this.percent, size.height),
- _valuePaint);
- canvas.restore();
- Path path = Path()
- ..moveTo(indicator, size.height - 13 - _paddingBar)
- ..lineTo(indicator - 5, 0)
- ..lineTo(indicator + 5, 0)
- ..close();
- canvas.drawPath(path, _indicatorPaint);
- }
- @override
- bool shouldRepaint(CustomPainter oldDelegate) {
- return false;
- }
- }
|