flutter入门开发的一些坑
flutter入门开发的一些坑
很久没写博客了,最近在准备物联网比赛,顺便抽出时间学习了一下flutter,花了近2周完成了一个查看博客博文的一个小的APPdemo,随便截了两张图,如下:
| 首页 | 博客园的页面,必须登录才有这些东西 |
|---|---|
![]() |
![]() |
总的来说项目还是比较简单的,(项目地址)没有什么复杂的逻辑和界面(毕竟是刚学,也没有能力去弄复杂的逻辑和界面),目前来说就这样吧。接下来我将记录一下开发中遇到的一些困难以及解决方法。
flutter博客园
认证解决方法
这里是博客园的api网址(https://api.cnblogs.com/),这里说一下博客园文档比较坑的地方,博客园的登录是基于OAuth 2.0认证的,不了解这个认证的同学查一下就知道了,简单点来说就是用户登录博客园后返回一个code给你,然后你通过这个code拿到token,通过token你就可以拿到用户的信息。
在博客园中,token有两种获取方式,第一种你就别想了,是不可能获取数据的,2.1和2.2才是正确获取数据的方式,emm,那么为什么1出现在博客园的官方文档中呢?
OK,那么我们讨论下第二种的获取方式,第二种获取方式是当用户输入账号密码后,点击登录,博客园会跳转到一个界面,这个界面里面显示着code。那么我们在flutter中间应该怎么做呢?
思路是这样的,首先我们打开博客园的登录界面,然后监听当前网址是否发生变化,如果发生了变化,那么代表着已经进行跳转了,然后我们在跳转的页面通过执行js代码拿到code就行。
通过执行code_value js代码就可以拿到code
在页面初始化init中,我们可以监听页面是否跳转。
// 监听页面跳转
flutterWebViewPlugin.onUrlChanged.listen((url) {
// 该页面会接收code,然后根据code换取AccessToken,并将获取到的token及其他信息,通过js的get()方法返回
if (url != null && url.length > 0 && url.contains("code=")) {
// 在parseReslut中,我们获得code,然后再去获取token
parseResult();
}
});
然后我们就可以通过执行js代码获得code了
/// 通过code获得token
parseResult() {
// 执行code_value js代码获得code
flutterWebViewPlugin.evalJavascript("code_value").then((code) {
if (code != null && code.length != 0) {
// 下面是获取token,不需要管
_cnblogNetService.getToken(code, storageToken);
}
});
}
获得登录用户的信息
这里就顺便提一下博客园获取用户的基本信息的api吧,可以吐槽一下,博客园的api官方文档是我见过第二坑的api文档,第一是百度统计的api文档。(不过博客园的官方还是蛮给力的,凌晨在博问上面提问都马上给了回答)
在这里,不能缺少bearer。
博客园获取首页数据
在博客园的API中,它是这样写的,但是实际上,这样你是无法获得首页的数据的。因为你缺少了header,header的数据和上面的一样(别忘记了Bearer),同时pageIndex不是从0开始的,而是从1开始的。
flutter 加载内置HTML
在项目中,需要制作一个AboutMe的页面,但是不想写一个新的一个页面,就直接将Markdown转成html,然后加载就行了。
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:webview_flutter/webview_flutter.dart';
/// aboutme的页面
class AboutMePage extends StatefulWidget {
@override
AboutMePageState createState() {
return AboutMePageState();
}
}
class AboutMePageState extends State<AboutMePage> {
WebViewController _controller;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('关于')),
body: WebView(
initialUrl: '',
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
// 加载本地html
_loadHtmlFromAssets();
},
),
);
}
// 从本地加载html文件,需要使用异步操作
_loadHtmlFromAssets() async {
String fileText = await rootBundle.loadString('image/README.html');
_controller.loadUrl(Uri.dataFromString(fileText,
mimeType: 'text/html', encoding: Encoding.getByName('utf-8'))
.toString());
}
}
当然,我们需要设置assets:
目前来说,只遇到了这些问题,因为这个app还仅仅是一个简单的demo,还没有复杂的页面,所以基本上没有什么控件的问题。
这个项目还是很多bug的,但是我能怎么办,我也很无奈啊。
这个是app的下载地址~~~~
flutter入门开发的一些坑的更多相关文章
- Flutter入门教程(二)开发环境搭建
学习Flutter,首先需要搭建好Flutter的开发环境,下面我将一步步带领大家搭建开发环境并且成功运行flutter项目. Flutter环境配置主要有这几点: 系统配置要求 Java环境 Flu ...
- 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...
- flutter 安装过程遇到的坑
Flutter是一个移动应用程序的软件开发工具包(SDK),用一个代码库构建高性能.高保真的iOS和Android应用程序.目标是使开发人员能够为Android和iOS提供自然的高质量的应用,在滚动行 ...
- Flutter完整开发实战详解
Flutter完整开发实战详解(一.Dart语言和Flutter基础) Flutter完整开发实战详解(二. 快速开发实战篇) Flutter完整开发实战详解(三. 打包与填坑篇)
- Flutter混合开发:Android接入Flutter
Flutter Google推出已经已经一年多了,单个 Flutter 项目的开发流程已经很成熟了.对与个人开发者来说使用 Flutter 开发一个跨平台的App挺有意思.但是对于现有的项目改造来说还 ...
- flutter 入门(Mac)
背景 近一年时间都在用 React Native 开发公司的 APP,水平基本上可以说是登堂入室了.前一段时间兴起一阵 Flutter 热,后端的同事都有推荐,今年 Google 大会又推出 flut ...
- 【Flutter 混合开发】嵌入原生View-Android
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-IOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- 【Flutter 混合开发】嵌入原生View-iOS
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- 【Flutter 混合开发】与原生通信-MethodChannel
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-iOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
随机推荐
- Python - Django - SweetAlert 插件的使用
SweetAlert Github:https://github.com/lipis/bootstrap-sweetalert 下载完后放入 /static/ 目录下 sweetalert.html: ...
- IDEA中MyBatis插件的安装及使用
这个插件的好处就在于能自动关联mapper类与xml,让你可以快速的互相跳转,还能帮助你做简单的排错. 安装方法: 1.File→Settings→Plugins,输入mybatis plugin,本 ...
- [LeetCode] 219. Contains Duplicate II 包含重复元素 II
Given an array of integers and an integer k, find out whether there are two distinct indices i and j ...
- [LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树
You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...
- [LeetCode] 682. Baseball Game 棒球游戏
You're now a baseball game point recorder. Given a list of strings, each string can be one of the 4 ...
- django:下拉框二级联动实现
注意:只列举核心部分代码 前台模板: 第一级下拉菜单: <div class="col-sm-4"> <select data-placeholder=" ...
- Kubernetes 健康状态检查(九)
强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readiness 探测机制设置更精 ...
- SpringBoot读取properties中的属性值
1.在application.properties中添加以下内容: learn.blog.name=hello learn.blog.title=千回教育系统 2.新增属性关联的类: package ...
- VueJS中学习使用Vuex详解
转载自:https://segmentfault.com/a/1190000015782272,做了部分修改(这里建议不要用所谓的getters,一来多次一举,二来模块化时会产生很不协调的用法) 在S ...
- 面试官问你MySQL的优化,看这篇文章就够了
作者:zhangqh segmentfault.com/a/1190000012155267 一.EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划. 下面来个简单的示例 ...

