//登录成功
eventBus.fire(LoginEvent());
}
}
Container _buildHeader() {
return Container(
height: 150.0,
color: Color(AppColors.APP_THEME),
//头像的布局填充
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
child: Container(
width: 60.0,
height: 60.0,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: Color(0xffffffff),
width: 2.0,
),
image: DecorationImage(
//加载网路图片
image: AssetImage(‘assets/images/ic_avatar_default.png’),
fit: BoxFit.cover,
),
),
),
onTap: () {
//执行登录
_login();
},
),
SizedBox(
),
Text(
‘点击头像登录’,
style: TextStyle(color: Color(0xffffffff)),
),
],
),
),
);
}
}
login_web_page.dart登录页面跳转逻辑,数据拼接组装校验,数据保存完成以后会调用Navigator.pop(context, ‘refresh’);通过路由跳转到My的界面
import ‘dart:convert’;
import ‘package:flutter/cupertino.dart’;
import ‘package:flutter/material.dart’;
import ‘package:flutter_webview_plugin/flutter_webview_plugin.dart’;
import ‘package:flutterapp2/constants/Constants.dart’;
import ‘package:flutterapp2/utils/data_utils.dart’;
import ‘package:flutterapp2/utils/net_utils.dart’;
class LoginWebPage extends StatefulWidget {
@override
_LoginWebPageState createState() => _LoginWebPageState();
}
class _LoginWebPageState extends State {
FlutterWebviewPlugin _flutterWebviewPlugin = FlutterWebviewPlugin();
bool isLoading = true;
@override
void initState() {
// TODO: implement initState
super.initState();
//监听url的变化
_flutterWebviewPlugin.onUrlChanged.listen((url) {
//https://www.oschina.net/action/oauth2/authorize?response_type=code&client_id=6i4Yu6IUqXnR64em0rsJ&redirect_uri=https://www.dongnaoedu.com/
print(‘Debug LoginWebPage onUrlChanged: $url’);
if (mounted) {
setState(() {
isLoading = true;
});
}
if (url != null && url.length > 0 && url.contains(‘?code=’)) {
//登录成功了
//提取授权码code
String code = url.split(‘?’)[1].split(‘&’)[0].split(‘=’)[1];
Map<String, dynamic> params = Map<String, dynamic>();
params[‘client_id’] = AppInfos.CLIENT_ID;
params[‘client_secret’] = AppInfos.CLIENT_SECRET;
params[‘grant_type’] = ‘authorization_code’;
params[‘redirect_uri’] = AppInfos.REDIRECT_URI;
params[‘code’] = ‘$code’;
params[‘dataType’] = ‘json’;
NetUtils.get(AppUrls.OAUTH2_TOKEN, params).then((data) {
//{“access_token”:“aa105aaf-ca4f-4458-822d-1ae6a1fa33f9”,“refresh_token”:“daae8b80-3ca6-4514-a8ae-acb3a82c951c”,“uid”:2006874,“token_type”:“bearer”,“expires_in”:510070}
//this is login_web_page: {“access_token”:“d0e00aa3-4d43-4a05-ab76-546d351ce5d5”,“refresh_token”:“555f4e8a-bccc-4976-9d7e-1d5183ef5798”,“uid”:4571926,“token_type”:“bearer”,“expires_in”:604295}
print(‘Debug this is login_web_page: $data’);
if (data != null) {
Map<String, dynamic> map = json.decode(data);
if (map != null && map.isNotEmpty) {
//保存token等信息
DataUtils.saveLoginInfo(map);
//弹出当前路由,并返回refresh通知我的界面刷新数据
Navigator.pop(context, ‘refresh’);
}
}
});
}
});
}
@override
void dispose() {
// TODO: implement dispose
super.dispose();
_flutterWebviewPlugin.close();
}
@override
Widget build(BuildContext context) {
//authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https
List _appBarTitle = [
Text(
‘登录开源中国’,
style: TextStyle(
color: Color(AppColors.APPBAR),
),
),
];
if(isLoading) {
_appBarTitle.add(SizedBox(
width: 10.0,
));
_appBarTitle.add(CupertinoActivityIndicator());
}
return WebviewScaffold(
url: AppUrls.OAUTH2_AUTHORIZE +
‘?response_type=code&client_id=’ +
AppInfos.CLIENT_ID +
‘&redirect_uri=’ +
AppInfos.REDIRECT_URI,
appBar: AppBar(
title: Row(
children: _appBarTitle,
),
),
withJavascript: true,//允许执行js
withLocalStorage: true,//允许本地存储
withZoom: true,//允许网页缩放
);
}
}
net_utils.dart网络数据的请求处理
import ‘package:http/http.dart’ as http;
class NetUtils{
//返回类型是String,是一个JSON
///authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri
static Future get(String url, Map<String, dynamic> params) async{
if(url != null && params != null && params.isNotEmpty) {
//拼装参数
StringBuffer sb = StringBuffer(‘?’);
params.forEach((key, value) {
sb.write(‘ k e y = key= key=value&’);
});
//去掉最后一个&
String paramStr = sb.toString().substring(0, sb.length - 1);
url += paramStr;
}
//NetUtils : https://www.oschina.net/action/openapi/token?client_id=6ZmjMJ4ZCW7YRhQ4sm42&client_secret=sXWCxyV1KegoF2gethYuBZhI8WQI9fjk&grant_type=authorization_code&redirect_uri=https://www.dongnaoedu.com/&code=1s8xBT&dataType=json
print(‘Debug NetUtils : $url’);
http.Response response = await http.get(url);
return response.body;
}
}
data_utils.dart数据的封装和拼接
import ‘package:shared_preferences/shared_preferences.dart’;
class DataUtils{
static const String SP_ACCESS_TOKEN = ‘access_token’;
static const String SP_REFRESH_TOKEN = ‘refresh_token’;
static const String SP_UID = ‘uid’;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
Java架构进阶面试及知识点文档笔记
这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
互联网Java程序员面试必备问题解析及文档学习笔记
Java架构进阶视频解析合集
Tp9Ws1i-1710398635098)]
最后
Java架构进阶面试及知识点文档笔记
这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理
[外链图片转存中…(img-plMN6ccm-1710398635099)]
Java分布式高级面试问题解析文档
其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!
[外链图片转存中…(img-svPVhBOh-1710398635100)]
互联网Java程序员面试必备问题解析及文档学习笔记
[外链图片转存中…(img-Ykboe2Mo-1710398635100)]
Java架构进阶视频解析合集