mirror of
https://github.com/alibaba/flutter-go.git
synced 2025-05-17 21:05:56 +08:00
Merge branch 'beta' of https://github.com/alibaba/flutter-go into beta2
This commit is contained in:
49
README.md
49
README.md
@ -1,14 +1,45 @@
|
||||
# Flutter Go
|
||||
Language: [English](https://github.com/alibaba/flutter-go/blob/master/README-en.md) | [中文简体](https://github.com/alibaba/flutter-go/blob/master/README.md)
|
||||
## Flutter Go
|
||||
|
||||

|
||||
|
||||
> 帮助开发者快速上手 Flutter **Flutter Go 1.0 Android版已正式发布**
|
||||
> 一个帮助开发者快速上手的 `APP`
|
||||
|
||||
## 最新动态
|
||||
### 🔥 `Flutter Go 2.0` 即将发布
|
||||
> Flutter Go 2.0 秉承年初发布的 [The Flutter-Go Roadmap(路线图) for 2019](https://github.com/alibaba/flutter-go#the-flutter-go-roadmap%E8%B7%AF%E7%BA%BF%E5%9B%BE-for-2019) 已经做了新版本的迭代,新版本如下新功能:
|
||||
|
||||
<h6>注:✔是本次发布内容</h6>
|
||||
|
||||
- [x] [ `Flutter Go` 官方网站 ](https://flutter-go.pub/website/) (官方消息,发布,学习)
|
||||
- [x] [ `Flutter Go web` 版本](https://github.com/alibaba/flutter-go/tree/web/flutter-go-web-0.0.1) (web 版本学习帮助)
|
||||
- [线上预览版 ](https://flutter-go.pub/flutter_go_web/)
|
||||
- [项目地址 ](https://github.com/alibaba/flutter-go/tree/web/flutter-go-web-0.0.1)
|
||||
|
||||
- [x] [ `Flutter Go Widget` 的 `pull request` 提交规范(第三方共建)](https://github.com/alibaba/flutter-go/blob/master/docs/contribute.md)
|
||||
|
||||
- [x] 用户中心 (专属个人的`widget`案例)
|
||||
- 用户登录(通过`GitHub`账户)
|
||||
- 全网搜索 (全网搜索 `Flutter` 资讯)
|
||||
- 收藏个人组件(保存到远端)
|
||||
- 反馈建议 (APP 在线 `ISSUES`)
|
||||
- 分享链接 (APP分享)
|
||||
- [x] [ `go-cli` 工具 ](https://github.com/alibaba/flutter-go/blob/master/docs/widget.md)
|
||||
- `Flutter Go` 的 `pull request` 工具
|
||||
- [命令行 生成 `Flutter Go Widget` 标准公共模版](https://github.com/alibaba/flutter-go/blob/beta/docs/widget.md)
|
||||
- `markdown` 模版动态化生成(合并到master分支后)
|
||||
- [x] ` Flutter Go ` 官方 `APP` 版本自动升级
|
||||
- [ ] 多端模版同步( pc端,native端同步 )
|
||||
- [ ] `Flutter Go` store
|
||||
|
||||
|
||||
|
||||
## 三方共建说明
|
||||
|
||||
由于 **flutter** 内容更新较快. 我们无法更快的丰富项目的内容. 如果您愿意为国内flutter的发展与学习贡献自己的力量, 请参考我们的 [共建说明](https://github.com/alibaba/flutter-go/blob/master/docs/contribute.md), 我们会将共建者的头像姓名贡献至我们的官网.
|
||||
|
||||
|
||||
|
||||
## 版本更新历史
|
||||
> 按时间顺序,展示重要的提交更新内容。
|
||||
|
||||
@ -49,6 +80,7 @@ Language: [English](https://github.com/alibaba/flutter-go/blob/master/README-en.
|
||||
### android正式版,下载地址:
|
||||
|
||||
- 华为市场已上线,华为应用市场搜索 "Fluttergo"或者直接[点击下载](https://appstore.huawei.com/search/fluttergo)
|
||||
- [直接 apk 文件下载](https://github.com/alibaba/flutter-go/releases/download/0.0.5/app-release.apk)
|
||||
<img src="https://img.alicdn.com/tfs/TB1LbEYarys3KVjSZFnXXXFzpXa-378-380.jpg" width=200>
|
||||
|
||||
### iphone正式版,下载地址:
|
||||
@ -60,8 +92,17 @@ Language: [English](https://github.com/alibaba/flutter-go/blob/master/README-en.
|
||||
## 基础环境
|
||||
本项目环境持续更新. 请定期更新各依赖包.
|
||||
|
||||
- dart(version: 2.0.0)
|
||||
- flutter(version: v1.0.0)
|
||||
```dart
|
||||
// 运行如下命令
|
||||
flutter --version
|
||||
dart --version
|
||||
pub --version
|
||||
|
||||
// 正确环境如下
|
||||
// Flutter (Channel beta, v1.7.8)
|
||||
// Dart VM version: 2.4.0
|
||||
// Pub 2.4.0
|
||||
```
|
||||
|
||||
|
||||
### 背景
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
- [如何向仓库提交 Pull Request](https://github.com/alibaba/flutter-go/blob/master/docs/push-pr.md)
|
||||
- [dart 代码规范](https://github.com/alibaba/flutter-go/blob/master/Flutter_Go%20%E4%BB%A3%E7%A0%81%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83.md)
|
||||
- [如何使用go-cli 创建 Widget Page](https://github.com/alibaba/flutter-go/blob/master/docs/go-cli.md)
|
||||
- [如何使用go-cli 创建 Widget Page](https://github.com/alibaba/flutter-go/blob/master/docs/widget.md)
|
||||
|
||||
|
||||
# 贡献指南
|
||||
|
@ -100,4 +100,17 @@ lib/standard_pages/standard_for_slider_sanfan_8ab2b5c2_42ae_4241_9c8a_5c9e1f92b0
|
||||
|
||||
## 引用Flutter 实例
|
||||
|
||||
如何在页面中引用flutter widget实例请参考: [WidgetDemo](https://github.com/alibaba/flutter-go/blob/beta/go-cli/utils/tpl.md)
|
||||
|
||||
如何在页面中引用flutter widget实例请参考: [WidgetDemo](https://github.com/alibaba/flutter-go/blob/master/go-cli/utils/tpl.md)
|
||||
|
||||
|
||||
|
||||
## 申请合并master
|
||||
|
||||
当我们的本地功能调试没有问题. 想要申请合并到主分支时.需要按以下流程进行
|
||||
|
||||
1.新建issue, 按照widget page类型模板, 填写需要的相关数据
|
||||
|
||||

|
||||
|
||||
2.创建pr, 标题简要描述界面内容. 内容框填写issueID 例如 "#12"
|
||||
|
@ -1,35 +0,0 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 3:20 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget: FlatButton 的示例
|
||||
*/
|
||||
import 'dart:async';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'dart:convert';
|
||||
import './search_result.dart';
|
||||
import 'package:html/parser.dart' show parse;
|
||||
|
||||
var dio = new Dio();
|
||||
class Api {
|
||||
Future<List<SearchResult>> search(name) async {
|
||||
print('=========>>>');
|
||||
var response = await dio.get("https://www.so.com/s?ie=utf-8&q=$name");
|
||||
// var document = parse(response.data);
|
||||
// var app = document.querySelectorAll('.res-title a');
|
||||
List<SearchResult> res = [];
|
||||
// app.forEach((f) {
|
||||
// res.add(
|
||||
// SearchResult(
|
||||
// title: f.text,
|
||||
// source: f.attributes["data-url"] ?? f.attributes["href"],
|
||||
// ),
|
||||
// );
|
||||
// });
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
Api api = Api();
|
@ -1,35 +0,0 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 7:17 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget:
|
||||
*/
|
||||
import 'dart:async';
|
||||
import 'package:bloc/bloc.dart';
|
||||
|
||||
import './search_event.dart';
|
||||
import './search_state.dart';
|
||||
import './search_api.dart';
|
||||
|
||||
|
||||
/// 这里导入api类与上面的SearchEvent与SearchState文件
|
||||
|
||||
class SearchBloc extends Bloc<SearchEvent, SearchState> {
|
||||
@override
|
||||
SearchState get initialState => SearchUninitialized();
|
||||
|
||||
@override
|
||||
Stream<SearchState> mapEventToState(SearchEvent event,) async* {
|
||||
if (event is SearchFetch) {
|
||||
try {
|
||||
yield SearchLoading();
|
||||
final res = await api.search(event.query);
|
||||
yield SearchLoaded(res: res);
|
||||
} catch (_) {
|
||||
yield SearchError();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 7:18 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget:
|
||||
*/
|
||||
abstract class SearchEvent {}
|
||||
|
||||
class SearchFetch extends SearchEvent {
|
||||
final String query;
|
||||
|
||||
SearchFetch({this.query});
|
||||
|
||||
@override
|
||||
String toString() => 'SearchFetch:获取搜索结果事件';
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 7:11 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget:
|
||||
*/
|
||||
class SearchResult {
|
||||
String title;
|
||||
String source;
|
||||
|
||||
SearchResult({this.title, this.source});
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 7:13 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget:
|
||||
*/
|
||||
import './search_result.dart';
|
||||
|
||||
abstract class SearchState {}
|
||||
|
||||
class SearchError extends SearchState {
|
||||
@override
|
||||
String toString() => 'SearchError:获取失败';
|
||||
}
|
||||
|
||||
class SearchUninitialized extends SearchState {
|
||||
@override
|
||||
String toString() => 'SearchUninitialized:未初始化';
|
||||
}
|
||||
|
||||
class SearchLoading extends SearchState {
|
||||
@override
|
||||
String toString() => 'SearchLoading :正在加载';
|
||||
}
|
||||
|
||||
class SearchLoaded extends SearchState {
|
||||
final List<SearchResult> res;
|
||||
|
||||
SearchLoaded({
|
||||
this.res,
|
||||
});
|
||||
|
||||
@override
|
||||
String toString() => 'SearchLoaded:加载完毕';
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 7:19 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget:
|
||||
*/
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
//import 'package:suiyi/blocs/search/bloc.dart';
|
||||
import './search_event.dart';
|
||||
import './search_state.dart';
|
||||
import './search_bloc.dart';
|
||||
|
||||
|
||||
class SearchWidget extends StatefulWidget {
|
||||
final SearchDelegate delegate;
|
||||
final String query;
|
||||
SearchWidget({this.delegate, this.query});
|
||||
@override
|
||||
_SearchWidgetState createState() => _SearchWidgetState();
|
||||
}
|
||||
|
||||
class _SearchWidgetState extends State<SearchWidget> {
|
||||
final SearchBloc _search = SearchBloc();
|
||||
String old;
|
||||
@override
|
||||
void dispose() {
|
||||
_search.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
print('1:${old}');
|
||||
print('2:${widget.query}');
|
||||
if (old != widget.query) {
|
||||
_search.dispatch(SearchFetch(query: widget.query));
|
||||
old = widget.query;
|
||||
}
|
||||
return BlocBuilder(
|
||||
bloc: _search,
|
||||
builder: (BuildContext context, SearchState state) {
|
||||
print('-------${state}');
|
||||
if (state is SearchUninitialized || state is SearchLoading) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (state is SearchError) {
|
||||
return Center(
|
||||
child: Text('获取失败'),
|
||||
);
|
||||
} else if (state is SearchLoaded) {
|
||||
return ListView.builder(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return ListTile(
|
||||
dense: true,
|
||||
leading: Icon(
|
||||
Icons.bookmark_border,
|
||||
size: 32,
|
||||
),
|
||||
title: Text(
|
||||
state.res[index].title,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
subtitle: Text(state.res[index].source),
|
||||
onTap: () {
|
||||
// 在这里对选中的结果进行解析,因为我目前是用golang实现的,所以就没贴代码了。
|
||||
print(state.res[index].source);
|
||||
},
|
||||
);
|
||||
},
|
||||
itemCount: state.res.length,
|
||||
);
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
@ -1,16 +1,14 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 3:20 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget: FlatButton 的示例
|
||||
*/
|
||||
//
|
||||
// Created with Android Studio.
|
||||
// User: 一晟
|
||||
// Date: 2019/4/28
|
||||
// Time: 3:20 PM
|
||||
// email: zhu.yan@alibaba-inc.com
|
||||
// tartget: FlatButton 的示例
|
||||
//
|
||||
import 'dart:async';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'dart:convert';
|
||||
import 'package:html/parser.dart' show parse;
|
||||
import './industry_model.dart';
|
||||
import './search_result.dart';
|
||||
|
||||
var dio = new Dio();
|
||||
|
@ -23,7 +23,7 @@ class SuggestionBloc extends Bloc<SuggestionEvent, SuggestionState> {
|
||||
try {
|
||||
yield SuggestionLoading();
|
||||
final res = await api.suggestion(event.query);
|
||||
print('res====>${res}');
|
||||
// print('res====>${res}');
|
||||
yield SuggestionLoaded(res: res);
|
||||
} catch (_) {
|
||||
yield SuggestionError();
|
||||
|
@ -1,10 +1,10 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 3:35 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
*/
|
||||
///
|
||||
/// Created with Android Studio.
|
||||
/// User: 一晟
|
||||
/// Date: 2019/4/28
|
||||
/// Time: 3:35 PM
|
||||
/// email: zhu.yan@alibaba-inc.com
|
||||
///
|
||||
abstract class SuggestionEvent {}
|
||||
|
||||
class SuggestionFetch extends SuggestionEvent {
|
||||
|
@ -1,14 +1,14 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 3:52 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
*/
|
||||
///
|
||||
/// Created with Android Studio.
|
||||
/// User: 一晟
|
||||
/// Date: 2019/4/28
|
||||
/// Time: 3:52 PM
|
||||
/// email: zhu.yan@alibaba-inc.com
|
||||
///
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import './industry_bloc.dart';
|
||||
import './industry_event.dart';
|
||||
/// import './industry_event.dart';
|
||||
import './industry_state.dart';
|
||||
|
||||
final SuggestionBloc suggestion = SuggestionBloc();
|
||||
@ -22,47 +22,46 @@ class IndustryPage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _IndustryState extends State<IndustryPage> {
|
||||
Widget renderItem(state) {
|
||||
if (state is SuggestionUninitialized) {
|
||||
return Center(
|
||||
child: Text('暂无内容'),
|
||||
);
|
||||
} else if (state is SuggestionLoading) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (state is SuggestionError) {
|
||||
return Center(
|
||||
child: Text('出现错误'),
|
||||
);
|
||||
} else if (state is SuggestionLoaded) {
|
||||
if (state.res.length == 0) {
|
||||
return Center(
|
||||
child: Text('没有适合的结果,更换查询条件试试'),
|
||||
);
|
||||
}else {
|
||||
if (widget.itemTitle is Function) {
|
||||
return widget.itemTitle(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Center(
|
||||
child: Text('没有适合的结果,更换查询条件试试')
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Material(
|
||||
child: Column(
|
||||
children: [
|
||||
// TextField(
|
||||
// autofocus: true,
|
||||
// textAlign: TextAlign.center,
|
||||
// onSubmitted: (text) {
|
||||
// print('onSubmitted:${text}');
|
||||
// suggestion.dispatch(SuggestionFetch(query: text));
|
||||
// },
|
||||
// ),
|
||||
Expanded(
|
||||
child: BlocBuilder(
|
||||
bloc: suggestion,
|
||||
builder: (BuildContext context, SuggestionState state) {
|
||||
print('BlocBuilder----${state}');
|
||||
if (state is SuggestionUninitialized) {
|
||||
return Center(
|
||||
child: Text('暂无内容'),
|
||||
);
|
||||
} else if (state is SuggestionLoading) {
|
||||
return Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
} else if (state is SuggestionError) {
|
||||
return Center(
|
||||
child: Text('出现错误'),
|
||||
);
|
||||
} else if (state is SuggestionLoaded) {
|
||||
if (state.res.length == 0) {
|
||||
return Center(
|
||||
child: Text('没有适合的结果,更换查询条件试试'),
|
||||
);
|
||||
}else {
|
||||
if (widget.itemTitle is Function) {
|
||||
return widget.itemTitle(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
builder: (BuildContext context, SuggestionState state){
|
||||
/// print('BlocBuilder----${state}');
|
||||
return renderItem(state);
|
||||
},
|
||||
),
|
||||
),
|
||||
|
@ -1,10 +1,10 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 3:19 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
*/
|
||||
///
|
||||
/// Created with Android Studio.
|
||||
/// User: 一晟
|
||||
/// Date: 2019/4/28
|
||||
/// Time: 3:19 PM
|
||||
/// email: zhu.yan@alibaba-inc.com
|
||||
///
|
||||
class Suggestion {
|
||||
String query;
|
||||
List<Suggestions> suggestions;
|
||||
|
@ -1,10 +1,10 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 3:37 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
*/
|
||||
///
|
||||
/// Created with Android Studio.
|
||||
/// User: 一晟
|
||||
/// Date: 2019/4/28
|
||||
/// Time: 3:37 PM
|
||||
/// email: zhu.yan@alibaba-inc.com
|
||||
///
|
||||
abstract class SuggestionState {}
|
||||
|
||||
class SuggestionError extends SuggestionState {
|
||||
|
@ -1,11 +1,11 @@
|
||||
/**
|
||||
* Created with Android Studio.
|
||||
* User: 一晟
|
||||
* Date: 2019/4/28
|
||||
* Time: 7:11 PM
|
||||
* email: zhu.yan@alibaba-inc.com
|
||||
* tartget:
|
||||
*/
|
||||
///
|
||||
/// Created with Android Studio.
|
||||
/// User: 一晟
|
||||
/// Date: 2019/4/28
|
||||
/// Time: 7:11 PM
|
||||
/// email: zhu.yan@alibaba-inc.com
|
||||
/// tartget:
|
||||
///
|
||||
class SearchResult {
|
||||
String title;
|
||||
String source;
|
||||
|
@ -3,7 +3,7 @@ import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../routers/application.dart';
|
||||
import '../model/cat.dart';
|
||||
/// import '../model/cat.dart';
|
||||
import '../model/widget.dart';
|
||||
import '../widgets/index.dart';
|
||||
import '../components/widget_item_container.dart';
|
||||
@ -65,7 +65,7 @@ class _CategoryHome extends State<CategoryHome> {
|
||||
}
|
||||
|
||||
void searchCatOrWidget() async {
|
||||
CommonItem widgetTree = Application.widgetTree;
|
||||
/// CommonItem widgetTree = Application.widgetTree;
|
||||
// 假设进入这个界面的parent一定存在
|
||||
CommonItem targetGroup = catHistory.last;
|
||||
|
||||
|
@ -9,7 +9,7 @@ import 'package:flutter_go/utils/data_utils.dart';
|
||||
import '../routers/application.dart';
|
||||
import '../routers/routers.dart';
|
||||
import '../components/markdown.dart';
|
||||
import '../model/collection.dart';
|
||||
/// import '../model/collection.dart';
|
||||
import '../widgets/index.dart';
|
||||
import '../event/event_bus.dart';
|
||||
import '../event/event_model.dart';
|
||||
@ -35,7 +35,7 @@ class WidgetDemo extends StatefulWidget {
|
||||
|
||||
class _WidgetDemoState extends State<WidgetDemo> {
|
||||
bool _hasCollected = false;
|
||||
CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||
/// CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||
var _collectionIcons;
|
||||
List widgetDemosList = new WidgetDemoList().getDemos();
|
||||
String widgetType = 'old';
|
||||
|
@ -86,7 +86,8 @@ class WidgetItemContainer extends StatelessWidget {
|
||||
index: addI,
|
||||
totalCount: length,
|
||||
rowLength: columnCount,
|
||||
textSize: true ? 'middle' : 'small',
|
||||
/// textSize: true ? 'middle' : 'small',
|
||||
textSize: 'middle'
|
||||
),
|
||||
),
|
||||
);
|
||||
|
@ -56,9 +56,13 @@ class _MyAppState extends State<MyApp> {
|
||||
var response;
|
||||
try{
|
||||
response = await NetUtils.get(reqs, {});
|
||||
print('response-${response}');
|
||||
print('response-$response');
|
||||
if(response['status'] == 200 && response['success'] ==true && response['data'] is Map && response['data']['isOpen'] == true) {
|
||||
Application.pageIsOpen = true;
|
||||
print('是否需要展开【业界动态】${Application.pageIsOpen}');
|
||||
}
|
||||
}catch(e){
|
||||
print('response-${e}');
|
||||
print('response-$e');
|
||||
}
|
||||
return response;
|
||||
}
|
||||
@ -66,6 +70,7 @@ class _MyAppState extends State<MyApp> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_reqsMainPageIsOpen();
|
||||
_startupJpush();
|
||||
|
||||
FlutterJPush.addConnectionChangeListener((bool connected) {
|
||||
@ -85,7 +90,6 @@ class _MyAppState extends State<MyApp> {
|
||||
} catch (error) {
|
||||
print('主动获取设备号Error:$error');
|
||||
}
|
||||
;
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -143,15 +147,6 @@ class _MyAppState extends State<MyApp> {
|
||||
print('身份信息验证失败:$onError');
|
||||
});
|
||||
|
||||
/// 服务端控制是否显示业界动态
|
||||
_reqsMainPageIsOpen().then((res){
|
||||
//{status: 200, data: {isOpen: true}, success: true}
|
||||
if(res['status'] == 200 && res['success'] ==true && res['data'] is Map && res['data']['isOpen'] == true) {
|
||||
Application.pageIsOpen = false;
|
||||
print('是否需要展开【业界动态】${Application.pageIsOpen}');
|
||||
}
|
||||
});
|
||||
|
||||
ApplicationEvent.event.on<UserSettingThemeColorEvent>().listen((event) {
|
||||
print('接收到的 event $event');
|
||||
});
|
||||
|
@ -162,7 +162,7 @@ abstract class CommonItem<T> {
|
||||
///
|
||||
CommonItem parent;
|
||||
String toString() {
|
||||
return "CommonItem {name: $name, type: $type, parentId: $parentId, token: $token, children长度 ${children}";
|
||||
return "CommonItem {name: $name, type: $type, parentId: $parentId, token: $token, children长度 $children";
|
||||
}
|
||||
|
||||
T getChild(String token);
|
||||
@ -361,7 +361,7 @@ class WidgetTree {
|
||||
print("getCommonItemByPath $path");
|
||||
print("root $root");
|
||||
CommonItem childLeaf;
|
||||
int first = path.first;
|
||||
/// int first = path.first;
|
||||
path = path.sublist(1);
|
||||
print("path:::: $path");
|
||||
if (path.length >= 0) {
|
||||
|
@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_go/utils/analytics.dart' show analytics;
|
||||
import '../widgets/index.dart';
|
||||
import './router_handler.dart';
|
||||
import '../standard_pages/index.dart';
|
||||
/// import '../standard_pages/index.dart';
|
||||
class Routes {
|
||||
static String root = "/";
|
||||
static String home = "/home";
|
||||
@ -20,9 +20,10 @@ class Routes {
|
||||
|
||||
static void configureRoutes(Router router) {
|
||||
List widgetDemosList = new WidgetDemoList().getDemos();
|
||||
router.notFoundHandler = new Handler(
|
||||
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
||||
});
|
||||
// router.notFoundHandler = new Handler(
|
||||
// handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
||||
// }
|
||||
// );
|
||||
router.define(home, handler: homeHandler);
|
||||
router.define(collectionPage,handler:collectionHandler);
|
||||
router.define(collectionFullPage,handler:collectionFullHandler);
|
||||
@ -32,19 +33,19 @@ class Routes {
|
||||
router.define(codeView,handler:fullScreenCodeDialog);
|
||||
router.define(githubCodeView,handler:githubCodeDialog);
|
||||
router.define(webViewPage,handler:webViewPageHand);
|
||||
router.define(issuesMessage, handler: issuesMessageHandler);
|
||||
widgetDemosList.forEach((demo) {
|
||||
Handler handler = new Handler(
|
||||
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
||||
print('组件路由params=$params widgetsItem=${demo.routerName}');
|
||||
analytics.logEvent(
|
||||
name: 'component', parameters: {'name': demo.routerName });
|
||||
return demo.buildRouter(context);
|
||||
});
|
||||
router.define(issuesMessage, handler: issuesMessageHandler);
|
||||
router.define(standardPage,handler:standardPageHandler);
|
||||
widgetDemosList.forEach((demo) {
|
||||
Handler handler = new Handler(
|
||||
handlerFunc: (BuildContext context, Map<String, List<String>> params) {
|
||||
print('组件路由params=$params widgetsItem=${demo.routerName}');
|
||||
analytics.logEvent(
|
||||
name: 'component', parameters: {'name': demo.routerName });
|
||||
return demo.buildRouter(context);
|
||||
});
|
||||
String path = demo.routerName;
|
||||
router.define('${path.toLowerCase()}', handler: handler);
|
||||
});
|
||||
router.define(standardPage,handler:standardPageHandler);
|
||||
// router.define(webViewPage,handler:webViewPageHand);
|
||||
// standardPages.forEach((String id, String md) => {
|
||||
//
|
||||
|
@ -5,7 +5,7 @@ import 'package:flutter_go/model/collection.dart';
|
||||
import 'package:flutter_go/model/version.dart';
|
||||
import 'package:flutter_go/model/widget.dart';
|
||||
import 'package:package_info/package_info.dart';
|
||||
import 'package:flutter_go/model/responseData.dart';
|
||||
/// import 'package:flutter_go/model/responseData.dart';
|
||||
|
||||
import './net_utils.dart';
|
||||
import '../model/user_info.dart';
|
||||
@ -117,6 +117,7 @@ class DataUtils {
|
||||
}
|
||||
} catch (error) {
|
||||
print('获取组件树 error $error');
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
@ -128,6 +129,7 @@ class DataUtils {
|
||||
return response != null && response['hasCollected'];
|
||||
} catch (error) {
|
||||
print('校验收藏 error $error');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,7 @@ class _CollectionFullPageState extends State<CollectionFullPage> {
|
||||
ApplicationEvent.event = eventBus;
|
||||
}
|
||||
|
||||
CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||
/// CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||
List<Collection> _collectionList = [];
|
||||
ScrollController _scrollController = new ScrollController();
|
||||
var _icons;
|
||||
|
@ -11,7 +11,7 @@ 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';
|
||||
import 'package:flutter_go/utils/data_utils.dart';
|
||||
/// import 'package:flutter_go/utils/data_utils.dart';
|
||||
|
||||
class CollectionPage extends StatefulWidget {
|
||||
final bool hasLogined;
|
||||
@ -26,7 +26,7 @@ class _CollectionPageState extends State<CollectionPage> {
|
||||
final eventBus = new EventBus();
|
||||
ApplicationEvent.event = eventBus;
|
||||
}
|
||||
CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||
/// CollectionControlModel _collectionControl = new CollectionControlModel();
|
||||
List<Collection> _collectionList = [];
|
||||
ScrollController _scrollController = new ScrollController();
|
||||
var _icons;
|
||||
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_go/views/first_page/drawer_page.dart';
|
||||
import './first_page.dart';
|
||||
import './sub_page.dart';
|
||||
/// import './sub_page.dart';
|
||||
import './main_app_bar.dart';
|
||||
import './search_page.dart';
|
||||
import 'package:flutter_go/model/user_info.dart';
|
||||
|
@ -87,15 +87,17 @@ class SearchBarPage extends StatefulWidget{
|
||||
|
||||
final TextEditingController controller = TextEditingController();
|
||||
var that;
|
||||
var loading;
|
||||
class _SearchBarPageState extends State<SearchBarPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
that = this;
|
||||
loading = false;
|
||||
}
|
||||
|
||||
Timer _resultsTimer;
|
||||
bool _loading = false;
|
||||
|
||||
String oldKey;
|
||||
/// 防抖函数
|
||||
Future getResultsDebounced(String text) async {
|
||||
@ -106,12 +108,12 @@ class _SearchBarPageState extends State<SearchBarPage> {
|
||||
if (text == '' || !mounted) {
|
||||
return;
|
||||
}
|
||||
_loading = true;
|
||||
loading = true;
|
||||
if (_resultsTimer != null && _resultsTimer.isActive) {
|
||||
_resultsTimer.cancel();
|
||||
}
|
||||
_resultsTimer = new Timer(new Duration(milliseconds: 400), () async {
|
||||
_loading = true;
|
||||
loading = true;
|
||||
if(mounted){
|
||||
suggestion.dispatch(SuggestionFetch(query: text));
|
||||
}
|
||||
@ -121,7 +123,7 @@ class _SearchBarPageState extends State<SearchBarPage> {
|
||||
|
||||
|
||||
void onSearchTextChanged(String text){
|
||||
print('onSearchTextChanged:${text}');
|
||||
print('onSearchTextChanged:$text');
|
||||
//suggestion.dispatch(SuggestionFetch(query: text));
|
||||
getResultsDebounced(text);
|
||||
}
|
||||
|
@ -6,20 +6,20 @@
|
||||
/// target: app首页
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
/// import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter_go/utils/data_utils.dart';
|
||||
import 'package:flutter_go/utils/shared_preferences.dart';
|
||||
import 'package:flutter_go/views/first_page/first_page.dart';
|
||||
/// import 'package:flutter_go/views/first_page/first_page.dart';
|
||||
import 'package:flutter_go/views/first_page/main_page.dart';
|
||||
import 'package:fluro/fluro.dart';
|
||||
import 'package:flutter_go/views/user_page/user_page.dart';
|
||||
import 'package:flutter_go/views/widget_page/widget_page.dart';
|
||||
import 'package:flutter_go/views/welcome_page/fourth_page.dart';
|
||||
import 'package:flutter_go/views/collection_page/collection_page.dart';
|
||||
/// import 'package:flutter_go/views/collection_page/collection_page.dart';
|
||||
import 'package:flutter_go/routers/application.dart';
|
||||
import 'package:flutter_go/utils/provider.dart';
|
||||
/// import 'package:flutter_go/utils/provider.dart';
|
||||
import 'package:flutter_go/model/widget.dart';
|
||||
import 'package:flutter_go/widgets/index.dart';
|
||||
/// import 'package:flutter_go/widgets/index.dart';
|
||||
import 'package:flutter_go/components/search_input.dart';
|
||||
import 'package:flutter_go/model/search_history.dart';
|
||||
import 'package:flutter_go/resources/widget_name_to_icon.dart';
|
||||
|
@ -1,5 +1,4 @@
|
||||
import 'dart:convert';
|
||||
|
||||
/// import 'dart:convert';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
||||
import 'package:zefyr/zefyr.dart';
|
||||
|
@ -67,9 +67,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
setState(() {
|
||||
isLoading = true;
|
||||
});
|
||||
DataUtils.getUserInfo(
|
||||
{'loginName': event.loginName, 'token': event.token})
|
||||
.then((result) {
|
||||
DataUtils.getUserInfo({'loginName': event.loginName,'token':event.token}).then((result) {
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
@ -137,6 +135,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
if (value.isEmpty) {
|
||||
return "登录名不可为空!";
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onSaved: (value) {
|
||||
setState(() {
|
||||
@ -179,6 +178,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
if (value == null || value.isEmpty) {
|
||||
return "密码不可为空!";
|
||||
}
|
||||
return null;
|
||||
},
|
||||
onSaved: (value) {
|
||||
setState(() {
|
||||
@ -217,7 +217,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
// 如果输入都检验通过,则进行登录操作
|
||||
// Scaffold.of(context)
|
||||
// .showSnackBar(new SnackBar(content: new Text("执行登录操作")));
|
||||
//调用所有自孩子<EFBFBD><EFBFBD>save回调,保存表单内容
|
||||
//调用所有自孩子的save回调,保存表单内容
|
||||
doLogin();
|
||||
}
|
||||
},
|
||||
@ -236,26 +236,22 @@ class _LoginPageState extends State<LoginPage> {
|
||||
setState(() {
|
||||
isLoading = false;
|
||||
});
|
||||
if (userResult.runtimeType == UserInformation) {
|
||||
try {
|
||||
_userInfoControlModel.deleteAll().then((result) {
|
||||
// print('删除结果:$result');
|
||||
_userInfoControlModel
|
||||
.insert(UserInfo(password: password, username: username))
|
||||
.then((value) {
|
||||
print('存储成功:$value');
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (context) => AppPage(userResult)),
|
||||
(route) => route == null);
|
||||
});
|
||||
try {
|
||||
if(userResult.runtimeType == UserInformation){
|
||||
|
||||
_userInfoControlModel.deleteAll().then((result) {
|
||||
// print('删除结果:$result');
|
||||
_userInfoControlModel
|
||||
.insert(UserInfo(password: password, username: username))
|
||||
.then((value) {
|
||||
print('存储成功:$value');
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (context) => AppPage(userResult)),
|
||||
(route) => route == null);
|
||||
});
|
||||
} catch (err) {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (context) => AppPage(userResult)),
|
||||
(route) => route == null);
|
||||
}
|
||||
}else if(userResult.runtimeType == String){
|
||||
Fluttertoast.showToast(
|
||||
});
|
||||
}else if(userResult.runtimeType == String){
|
||||
Fluttertoast.showToast(
|
||||
msg: userResult,
|
||||
toastLength: Toast.LENGTH_SHORT,
|
||||
gravity: ToastGravity.CENTER,
|
||||
@ -263,6 +259,11 @@ class _LoginPageState extends State<LoginPage> {
|
||||
backgroundColor: Theme.of(context).primaryColor,
|
||||
textColor: Colors.white,
|
||||
fontSize: 16.0);
|
||||
}
|
||||
} catch (err) {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(builder: (context) => AppPage(userResult)),
|
||||
(route) => route == null);
|
||||
}
|
||||
}).catchError((errorMsg) {
|
||||
setState(() {
|
||||
@ -388,8 +389,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
onPressed: () {
|
||||
Navigator.of(context).pushAndRemoveUntil(
|
||||
MaterialPageRoute(
|
||||
builder: (context) =>
|
||||
AppPage(UserInformation(id: 0))),
|
||||
builder: (context) => AppPage(UserInformation(id: 0))),
|
||||
(route) => route == null);
|
||||
},
|
||||
)
|
||||
@ -411,4 +411,4 @@ class _LoginPageState extends State<LoginPage> {
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@ -48,9 +48,10 @@ class _StandardView extends State<StandardView> {
|
||||
super.initState();
|
||||
this.getPageInfo();
|
||||
}
|
||||
didChangeDependencies() {
|
||||
print("didChangeDependencies");
|
||||
}
|
||||
|
||||
// didChangeDependencies() {
|
||||
// print("didChangeDependencies");
|
||||
// }
|
||||
/// 本地调用的获取文章属性的基本信息
|
||||
Future<void> localGetPagesAttrsInfo() async {
|
||||
String jsonString = await DefaultAssetBundle.of(context).loadString('lib/standard_pages/.pages.json');
|
||||
|
@ -4,15 +4,14 @@
|
||||
/// @Last Modified time: 2019-01-14 19:47:14
|
||||
|
||||
import 'dart:core';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
|
||||
|
||||
import 'package:flutter_go/model/collection.dart';
|
||||
/// import 'package:flutter_go/model/collection.dart';
|
||||
import 'package:flutter_go/event/event_bus.dart';
|
||||
import 'package:flutter_go/event/event_model.dart';
|
||||
import 'package:flutter_go/api/api.dart';
|
||||
import 'package:flutter_go/routers/application.dart' show Application;
|
||||
|
||||
class WebViewPage extends StatefulWidget {
|
||||
final String url;
|
||||
@ -22,10 +21,7 @@ class WebViewPage extends StatefulWidget {
|
||||
_WebViewPageState createState() => _WebViewPageState();
|
||||
}
|
||||
|
||||
class _WebViewPageState extends State<WebViewPage> with AutomaticKeepAliveClientMixin{
|
||||
@override
|
||||
bool get wantKeepAlive => true;
|
||||
|
||||
class _WebViewPageState extends State<WebViewPage> {
|
||||
final flutterWebviewPlugin = new FlutterWebviewPlugin();
|
||||
|
||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
@ -33,10 +29,8 @@ class _WebViewPageState extends State<WebViewPage> with AutomaticKeepAliveClient
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
dialog = dialogContext(false);
|
||||
|
||||
flutterWebviewPlugin.onUrlChanged.listen((String url) {
|
||||
|
||||
print('url change:$url');
|
||||
if (url.indexOf('loginSuccess') > -1) {
|
||||
String urlQuery = url.substring(url.indexOf('?') + 1);
|
||||
@ -68,75 +62,21 @@ class _WebViewPageState extends State<WebViewPage> with AutomaticKeepAliveClient
|
||||
flutterWebviewPlugin.close();
|
||||
}
|
||||
});
|
||||
flutterWebviewPlugin.onStateChanged.listen((state) async {
|
||||
print('url state:$state');
|
||||
if(state.type == WebViewState.finishLoad) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Widget dialogContext(bool isShow){
|
||||
if(!isShow){
|
||||
return Container(child:Text(""));
|
||||
}
|
||||
return Container(
|
||||
height: 200,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
SizedBox(height: 20),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: <Widget>[
|
||||
Text('分享到',style: TextStyle(fontSize:16,color: Colors.deepOrange)),
|
||||
FlatButton(
|
||||
child: Text('取消',style: TextStyle(fontSize:16,color: Colors.black45),),
|
||||
onPressed: (){
|
||||
setState(() {
|
||||
dialog = dialogContext(false);
|
||||
|
||||
});
|
||||
}
|
||||
)
|
||||
]
|
||||
)
|
||||
])
|
||||
);
|
||||
}
|
||||
|
||||
Container dialog;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
key: _scaffoldKey,
|
||||
appBar: AppBar(
|
||||
title: Text(widget.title),
|
||||
// actions: <Widget>[
|
||||
// IconButton(
|
||||
// icon: Icon(Icons.announcement),
|
||||
// onPressed: () {
|
||||
// /// flutterWebviewPlugin.evalJavascript("alert('Flutter Go H5 版本')");
|
||||
// setState(() {
|
||||
// dialog = dialogContext(true);
|
||||
// });
|
||||
// },
|
||||
// )
|
||||
// ],
|
||||
),
|
||||
body: WebviewScaffold(
|
||||
url: widget.url,
|
||||
withZoom: true,
|
||||
withLocalStorage: true,
|
||||
withJavascript: true,
|
||||
userAgent: "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Mobile Safari/537.36",
|
||||
bottomNavigationBar:dialog,
|
||||
initialChild: Container(
|
||||
color: Colors.white,
|
||||
child: const Center(
|
||||
child: Text("Loading...."),
|
||||
),
|
||||
),
|
||||
));
|
||||
|
||||
key: _scaffoldKey,
|
||||
appBar: AppBar(
|
||||
title: Text(widget.title),
|
||||
),
|
||||
body: WebviewScaffold(
|
||||
url: widget.url,
|
||||
withZoom: false,
|
||||
withLocalStorage: true,
|
||||
withJavascript: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ class _ScrollMetricsDemoState extends State<ScrollMetricsDemo> {
|
||||
});
|
||||
print("BottomEdge: ${notification.metrics.extentAfter == 0}");
|
||||
//return true; //放开此行注释后,进度条将失效
|
||||
return false;
|
||||
},
|
||||
child: Stack(
|
||||
alignment: Alignment.center,
|
||||
|
@ -24,6 +24,7 @@ class _ScrollPhysicsDemoState extends State<ScrollPhysicsDemo> {
|
||||
setState(() {
|
||||
_currentPage = _pageController.page;
|
||||
});
|
||||
return false;
|
||||
},
|
||||
child: PageView.custom(
|
||||
physics: const PageScrollPhysics(
|
||||
|
@ -95,16 +95,16 @@ class _CupertinoAppFullDefault extends State {
|
||||
],
|
||||
onGenerateRoute: (setting) {
|
||||
// 当通过Navigation.of(context).pushNamed跳转路由时,在routes查找不到时,会调用该方法
|
||||
routerHandler(setting);
|
||||
return routerHandler(setting);
|
||||
},
|
||||
onGenerateTitle: (context) {
|
||||
// 跟上面的tiitle一样,但含有一个context参数用于做本地化
|
||||
return 'Flutter应用';
|
||||
},
|
||||
onUnknownRoute: (setting) {
|
||||
// 效果跟onGenerateRoute一样调用顺序为onGenerateRoute ==> onUnknownRoute
|
||||
//RouterHandler(setting);
|
||||
},
|
||||
// onUnknownRoute: (setting) {
|
||||
// // 效果跟onGenerateRoute一样调用顺序为onGenerateRoute ==> onUnknownRoute
|
||||
// //RouterHandler(setting);
|
||||
// },
|
||||
routes: {
|
||||
// 声明程序中有哪个通过Navigation.of(context).pushNamed跳转的路由参数以键值对的形式传递key:路由名字value:对应的Widget
|
||||
'/home': (BuildContext context) => HomePage(),
|
||||
|
@ -29,8 +29,9 @@ class _Demo extends State<CupertinoSliverNavigationBarDemo> {
|
||||
trailing: Icon(Icons.perm_camera_mic)
|
||||
),
|
||||
CupertinoSliverRefreshControl(
|
||||
onRefresh: () {
|
||||
},
|
||||
// onRefresh: () {
|
||||
//
|
||||
// },
|
||||
),
|
||||
SliverSafeArea(
|
||||
top: false, // Top safe area is consumed by the navigation bar.
|
||||
|
392
pubspec.lock
Normal file
392
pubspec.lock
Normal file
@ -0,0 +1,392 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.5.2"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
bloc:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: bloc
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.12.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
charcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: charcode
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
city_pickers:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: city_pickers
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.0.4"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.14.11"
|
||||
cookie_jar:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cookie_jar
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
csslib:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: csslib
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.16.1"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cupertino_icons
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.1.2"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dio
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.13"
|
||||
event_bus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: event_bus
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
firebase_analytics:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_analytics
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0+1"
|
||||
firebase_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: firebase_core
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.3.4"
|
||||
fluro:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: fluro
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_bloc:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_bloc
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.11.1"
|
||||
flutter_downloader:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_downloader
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.9"
|
||||
flutter_jpush:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_jpush
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.0.4"
|
||||
flutter_spinkit:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_spinkit
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_webview_plugin:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_webview_plugin
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.3.5"
|
||||
fluttertoast:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: fluttertoast
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
html:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: html
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.14.0+2"
|
||||
image_picker:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: image_picker
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.5.4+3"
|
||||
intl:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: intl
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.15.7"
|
||||
lpinyin:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lpinyin
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.7"
|
||||
markdown:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: markdown
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.12.5"
|
||||
meta:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: meta
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.6"
|
||||
notus:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: notus
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.1.3"
|
||||
open_file:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: open_file
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
package_info:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: package_info
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.4.0+6"
|
||||
path:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.6.2"
|
||||
path_provider:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: path_provider
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
pedantic:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pedantic
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.7.0"
|
||||
permission_handler:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: permission_handler
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.2.2"
|
||||
quill_delta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quill_delta
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
quiver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quiver
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
quiver_hashcode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: quiver_hashcode
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: rxdart
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.21.0"
|
||||
share:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: share
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.6.2+1"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: shared_preferences
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.4.3"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.5.5"
|
||||
sqflite:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sqflite
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.6+3"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.9.3"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
string_scanner:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: string_scanner
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
synchronized:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: synchronized
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0+1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.2.5"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.6"
|
||||
url_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "5.1.2"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.0.8"
|
||||
zefyr:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: zefyr
|
||||
relative: true
|
||||
source: path
|
||||
version: "0.0.1"
|
||||
sdks:
|
||||
dart: ">=2.2.2 <3.0.0"
|
||||
flutter: ">=1.6.0 <2.0.0"
|
Reference in New Issue
Block a user