mirror of
https://github.com/alibaba/flutter-go.git
synced 2025-05-25 01:06:08 +08:00
@ -16,4 +16,12 @@ class Api{
|
|||||||
static const String FEEDBACK = BASE_URL+'auth/feedback';//建议反馈
|
static const String FEEDBACK = BASE_URL+'auth/feedback';//建议反馈
|
||||||
|
|
||||||
static const String LOTOUT = BASE_URL+'logout';//退出登陆
|
static const String LOTOUT = BASE_URL+'logout';//退出登陆
|
||||||
|
|
||||||
|
static const String GET_ALL_COLLECTION = BASE_URL+'auth/getAllUserCollection';//获取全部收藏
|
||||||
|
|
||||||
|
static const String REMOVE_COLLECTION = BASE_URL+'auth/removeCollection';//移除收藏
|
||||||
|
|
||||||
|
static const String ADD_COLLECTION = BASE_URL+'auth/addCollection';//添加收藏
|
||||||
|
|
||||||
|
static const String CHECK_COLLECTED = BASE_URL+'auth/checkCollected';//校验收藏
|
||||||
}
|
}
|
@ -8,6 +8,9 @@ import 'package:flutter_go/views/web_page/web_view_page.dart';
|
|||||||
import 'package:flutter_go/views/home.dart';
|
import 'package:flutter_go/views/home.dart';
|
||||||
import 'package:flutter_go/views/login_page/login_page.dart';
|
import 'package:flutter_go/views/login_page/login_page.dart';
|
||||||
import 'package:flutter_go/model/user_info.dart';
|
import 'package:flutter_go/model/user_info.dart';
|
||||||
|
import 'package:flutter_go/views/collection_page/collection_page.dart';
|
||||||
|
import 'package:flutter_go/views/collection_page/collection_full_page.dart';
|
||||||
|
|
||||||
|
|
||||||
// app的首页
|
// app的首页
|
||||||
var homeHandler = new Handler(
|
var homeHandler = new Handler(
|
||||||
@ -16,6 +19,20 @@ var homeHandler = new Handler(
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
var collectionFullHandler = new Handler(
|
||||||
|
handlerFunc: (BuildContext context,Map<String,List<String>> params){
|
||||||
|
bool hasLogined = params['hasLogin']?.first == 'true';
|
||||||
|
return CollectionFullPage(hasLogined: hasLogined);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
var collectionHandler = new Handler(
|
||||||
|
handlerFunc: (BuildContext context,Map<String,List<String>> params){
|
||||||
|
bool hasLogined = params['hasLogin']?.first == 'true';
|
||||||
|
return CollectionPage(hasLogined: hasLogined);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
var categoryHandler = new Handler(
|
var categoryHandler = new Handler(
|
||||||
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
||||||
String name = params["type"]?.first;
|
String name = params["type"]?.first;
|
||||||
|
@ -13,6 +13,8 @@ class Routes {
|
|||||||
static String codeView = '/code-view';
|
static String codeView = '/code-view';
|
||||||
static String webViewPage = '/web-view-page';
|
static String webViewPage = '/web-view-page';
|
||||||
static String loginPage = '/loginpage';
|
static String loginPage = '/loginpage';
|
||||||
|
static String collectionPage = '/collection-page';
|
||||||
|
static String collectionFullPage = '/collection-full-page';
|
||||||
|
|
||||||
static void configureRoutes(Router router) {
|
static void configureRoutes(Router router) {
|
||||||
List widgetDemosList = new WidgetDemoList().getDemos();
|
List widgetDemosList = new WidgetDemoList().getDemos();
|
||||||
@ -20,7 +22,8 @@ class Routes {
|
|||||||
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
||||||
});
|
});
|
||||||
router.define(home, handler: homeHandler);
|
router.define(home, handler: homeHandler);
|
||||||
|
router.define(collectionPage,handler:collectionHandler);
|
||||||
|
router.define(collectionFullPage,handler:collectionFullHandler);
|
||||||
router.define('/category/:type', handler: categoryHandler);
|
router.define('/category/:type', handler: categoryHandler);
|
||||||
router.define('/category/error/404', handler: widgetNotFoundHandler);
|
router.define('/category/error/404', handler: widgetNotFoundHandler);
|
||||||
router.define(loginPage, handler: loginPageHandler);
|
router.define(loginPage, handler: loginPageHandler);
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
import 'dart:async' show Future;
|
import 'dart:async' show Future;
|
||||||
|
|
||||||
|
import 'package:fluro/fluro.dart';
|
||||||
import 'package:flutter_go/model/version.dart';
|
import 'package:flutter_go/model/version.dart';
|
||||||
import 'package:package_info/package_info.dart';
|
import 'package:package_info/package_info.dart';
|
||||||
|
|
||||||
import './net_utils.dart';
|
import './net_utils.dart';
|
||||||
import '../model/user_info.dart';
|
import '../model/user_info.dart';
|
||||||
import 'package:flutter_go/api/api.dart';
|
import 'package:flutter_go/api/api.dart';
|
||||||
|
import 'package:flutter_go/routers/application.dart';
|
||||||
|
import 'package:flutter_go/routers/routers.dart';
|
||||||
|
|
||||||
class DataUtils {
|
class DataUtils {
|
||||||
// 登陆获取用户信息
|
// 登陆获取用户信息
|
||||||
@ -46,9 +49,12 @@ class DataUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 一键反馈
|
// 一键反馈
|
||||||
static Future feedback(Map<String, String> params) async {
|
static Future feedback(Map<String, String> params, context) async {
|
||||||
var response = await NetUtils.post(Api.FEEDBACK, params);
|
var response = await NetUtils.post(Api.FEEDBACK, params);
|
||||||
print(response);
|
// print(response);
|
||||||
|
if(response['status'] == 401 && response['message']=='请先登录'){
|
||||||
|
Application.router.navigateTo(context, '${Routes.loginPage}',transition:TransitionType.nativeModal);
|
||||||
|
}
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
167
lib/views/collection_page/collection_full_page.dart
Normal file
167
lib/views/collection_page/collection_full_page.dart
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
/// @Author: 一凨
|
||||||
|
/// @Date: 2019-06-05 14:01:03
|
||||||
|
/// @Last Modified by: 一凨
|
||||||
|
/// @Last Modified time: 2019-06-05 14:01:03
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:event_bus/event_bus.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_go/model/collection.dart';
|
||||||
|
import 'package:flutter_go/routers/application.dart';
|
||||||
|
import 'package:flutter_go/routers/routers.dart';
|
||||||
|
import 'package:flutter_go/event/event_bus.dart';
|
||||||
|
import 'package:flutter_go/event/event_model.dart';
|
||||||
|
|
||||||
|
class CollectionFullPage extends StatefulWidget {
|
||||||
|
final bool hasLogined;
|
||||||
|
CollectionFullPage({Key key, this.hasLogined}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_CollectionFullPageState createState() => _CollectionFullPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CollectionFullPageState extends State<CollectionFullPage> {
|
||||||
|
_CollectionFullPageState() {
|
||||||
|
final eventBus = new EventBus();
|
||||||
|
ApplicationEvent.event = eventBus;
|
||||||
|
}
|
||||||
|
|
||||||
|
CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||||
|
List<Collection> _collectionList = [];
|
||||||
|
ScrollController _scrollController = new ScrollController();
|
||||||
|
var _icons;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_getList();
|
||||||
|
ApplicationEvent.event.on<CollectionEvent>().listen((event) {
|
||||||
|
_getList();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _getList() {
|
||||||
|
_collectionList.clear();
|
||||||
|
_collectionControl.getAllCollection().then((resultList) {
|
||||||
|
resultList.forEach((item) {
|
||||||
|
_collectionList.add(item);
|
||||||
|
});
|
||||||
|
if (this.mounted) {
|
||||||
|
setState(() {
|
||||||
|
_collectionList = _collectionList;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_scrollController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _renderList(context, index) {
|
||||||
|
if (index == 0) {
|
||||||
|
return Container(
|
||||||
|
height: 40.0,
|
||||||
|
padding: const EdgeInsets.only(left: 10.0),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget>[
|
||||||
|
Icon(
|
||||||
|
Icons.warning,
|
||||||
|
size: 22.0,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 5.0,
|
||||||
|
),
|
||||||
|
Text('模拟器重新运行会丢失收藏'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (_collectionList[index - 1].router.contains('http')) {
|
||||||
|
if (_collectionList[index - 1].name.endsWith('Doc')) {
|
||||||
|
_icons = Icons.library_books;
|
||||||
|
} else {
|
||||||
|
_icons = Icons.language;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_icons = Icons.extension;
|
||||||
|
}
|
||||||
|
return Container(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 5.0),
|
||||||
|
margin: const EdgeInsets.only(bottom: 7.0),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.white,
|
||||||
|
boxShadow: [
|
||||||
|
new BoxShadow(
|
||||||
|
color: const Color(0xFFd0d0d0),
|
||||||
|
blurRadius: 1.0,
|
||||||
|
spreadRadius: 2.0,
|
||||||
|
offset: Offset(3.0, 2.0),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(
|
||||||
|
_icons,
|
||||||
|
size: 30.0,
|
||||||
|
color: Theme.of(context).primaryColor,
|
||||||
|
),
|
||||||
|
title: Text(
|
||||||
|
Uri.decodeComponent(_collectionList[index - 1].name),
|
||||||
|
overflow: TextOverflow.ellipsis,
|
||||||
|
style: TextStyle(fontSize: 17.0),
|
||||||
|
),
|
||||||
|
trailing:
|
||||||
|
Icon(Icons.keyboard_arrow_right, color: Colors.grey, size: 30.0),
|
||||||
|
onTap: () {
|
||||||
|
if (_collectionList[index - 1].router.contains('http')) {
|
||||||
|
// 注意这里title已经转义过了
|
||||||
|
Application.router.navigateTo(context,
|
||||||
|
'${Routes.webViewPage}?title=${_collectionList[index - 1].name}&url=${Uri.encodeComponent(_collectionList[index - 1].router)}');
|
||||||
|
} else {
|
||||||
|
Application.router
|
||||||
|
.navigateTo(context, "${_collectionList[index - 1].router}");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ListView buildContent(){
|
||||||
|
if (_collectionList.length == 0) {
|
||||||
|
return ListView(
|
||||||
|
children: <Widget>[
|
||||||
|
Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Image.asset(
|
||||||
|
'assets/images/nothing.png',
|
||||||
|
fit: BoxFit.contain,
|
||||||
|
width: MediaQuery.of(context).size.width / 2,
|
||||||
|
),
|
||||||
|
Text('暂无收藏,赶紧去收藏一个吧!'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return ListView.builder(
|
||||||
|
itemBuilder: _renderList,
|
||||||
|
itemCount: _collectionList.length + 1,
|
||||||
|
controller: _scrollController,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('我的收藏'),
|
||||||
|
),
|
||||||
|
body: Container(
|
||||||
|
child: buildContent(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -12,8 +12,11 @@ import 'package:flutter_go/routers/routers.dart';
|
|||||||
import 'package:flutter_go/event/event_bus.dart';
|
import 'package:flutter_go/event/event_bus.dart';
|
||||||
import 'package:flutter_go/event/event_model.dart';
|
import 'package:flutter_go/event/event_model.dart';
|
||||||
|
|
||||||
|
|
||||||
class CollectionPage extends StatefulWidget {
|
class CollectionPage extends StatefulWidget {
|
||||||
|
final bool hasLogined;
|
||||||
|
|
||||||
|
CollectionPage({Key key, this.hasLogined}) : super(key: key);
|
||||||
|
|
||||||
_CollectionPageState createState() => _CollectionPageState();
|
_CollectionPageState createState() => _CollectionPageState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import 'package:fluro/fluro.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_go/model/user_info.dart';
|
import 'package:flutter_go/model/user_info.dart';
|
||||||
import 'package:share/share.dart';
|
import 'package:share/share.dart';
|
||||||
@ -25,6 +26,44 @@ class _DrawerPageState extends State<DrawerPage> {
|
|||||||
hasLogin = this.widget.userInfo.id != 0;
|
hasLogin = this.widget.userInfo.id != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void showLogoutDialog() {
|
||||||
|
if (hasLogin) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: Text('确认退出登陆?'),
|
||||||
|
// content: Text('退出登陆后将没法进行'),
|
||||||
|
actions: <Widget>[
|
||||||
|
FlatButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
// 退出登陆
|
||||||
|
DataUtils.logout().then((result) {
|
||||||
|
if (result) {
|
||||||
|
setState(() {
|
||||||
|
hasLogin = false;
|
||||||
|
});
|
||||||
|
Application.router.navigateTo(context, '${Routes.loginPage}',transition:TransitionType.nativeModal,clearStack: true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Text('确认',style: TextStyle(color: Colors.red),),
|
||||||
|
),
|
||||||
|
FlatButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text('取消'),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Application.router.navigateTo(context, '${Routes.loginPage}',transition:TransitionType.native,clearStack: true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
print(hasLogin);
|
print(hasLogin);
|
||||||
@ -59,7 +98,9 @@ class _DrawerPageState extends State<DrawerPage> {
|
|||||||
'我的收藏',
|
'我的收藏',
|
||||||
style: textStyle,
|
style: textStyle,
|
||||||
),
|
),
|
||||||
onTap: () {},
|
onTap: () {
|
||||||
|
Application.router.navigateTo(context, '${Routes.collectionFullPage}?hasLogin=${hasLogin.toString()}',transition: TransitionType.fadeIn);
|
||||||
|
},
|
||||||
),
|
),
|
||||||
// new Divider(),
|
// new Divider(),
|
||||||
ListTile(
|
ListTile(
|
||||||
@ -88,7 +129,7 @@ class _DrawerPageState extends State<DrawerPage> {
|
|||||||
DataUtils.feedback({
|
DataUtils.feedback({
|
||||||
'title': "这是客户端 FeedBack title",
|
'title': "这是客户端 FeedBack title",
|
||||||
"body": "这是客户端 FeedBack body"
|
"body": "这是客户端 FeedBack body"
|
||||||
}).then((result) {
|
},context).then((result) {
|
||||||
print(result);
|
print(result);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -127,21 +168,7 @@ class _DrawerPageState extends State<DrawerPage> {
|
|||||||
hasLogin ? '退出登陆' : '点击登录',
|
hasLogin ? '退出登陆' : '点击登录',
|
||||||
style: textStyle,
|
style: textStyle,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: showLogoutDialog,
|
||||||
if (hasLogin) {
|
|
||||||
// 退出登陆
|
|
||||||
DataUtils.logout().then((result) {
|
|
||||||
if (result) {
|
|
||||||
setState(() {
|
|
||||||
hasLogin = false;
|
|
||||||
});
|
|
||||||
Application.router.navigateTo(context, '${Routes.loginPage}');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Application.router.navigateTo(context, '${Routes.loginPage}');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -70,7 +70,7 @@ class _MyHomePageState extends State<AppPage>
|
|||||||
// ..add(FirstPage())
|
// ..add(FirstPage())
|
||||||
..add(MainPage(userInfo: widget.userInfo))
|
..add(MainPage(userInfo: widget.userInfo))
|
||||||
..add(WidgetPage(Provider.db))
|
..add(WidgetPage(Provider.db))
|
||||||
..add(CollectionPage())
|
..add(CollectionPage(hasLogined: widget.userInfo.id != 0))
|
||||||
..add(FourthPage());
|
..add(FourthPage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user