解决冲突

This commit is contained in:
yifeng.yl
2019-08-08 12:39:05 +08:00
34 changed files with 812 additions and 341 deletions

View File

View File

@ -12,56 +12,14 @@
# Issue # Issue
PR的第一步是提交issue即提交你发现的BUG 或者 想加入的功能, 选择你issue在类型 pr的第一步是提交issue即提交你发现的BUG 或者 想加入的功能, 选择你issue在类型
![](https://img.alicdn.com/tfs/TB1r3LEbKL2gK0jSZFmXXc7iXXa-858-317.png) ![](https://img.alicdn.com/tfs/TB1r3LEbKL2gK0jSZFmXXc7iXXa-858-317.png)
您的 Pull Request 可能包含以下几种 您的 Issue 可能包含以下几种
- 当前项目逻辑代码的问题修复或者优化 - bug report (修复逻辑相关bug)
- widget 示例的完善 - feature (增加新的功能)
- widget 文档的完善与更新 - widget (关于widget示例展示)
# 文档与DEMO的完善
一个widget的demo实例与文档说明, 由以下目录构成, 我们以**/lib/widgets/components/Tab/Tab**组件举例, 在此文件目录下构建您的demo运行即可看到效果
- index.dart
- demo.dart
# 撰写 Pull Request
为了更好的将 *flutter* 的各种使用方法分享给大家, 我们欢迎第三方提交个人Pull Request(简称为PR)到开源仓库中. 提交的PR需要满足以下规则:
- PR 的提交名称, 请使用有意义可以理解的词汇, 否则我们请直接关闭它.
- 例如: 增加了XX功能, 优化..., 修复在 XX 状态下对 XX 的异常处理
- PR 只能被提交合并到 *develop* 分支, 被提交到master的 PR, 我们将会直接关闭.
- PR 的描述区,需要描述本次改动的主要内容, 以及为什么要如此改动.
- 避免超大的 PR 提交
- 当 PR 的改动 **change** 超过1000行(暂定为1000)时, 请尽量拆分后进行提交.
- 规范化的commit信息
- commit规范参照[develop规范](https://github.com/alibbaba/flutter-go/blob/master/develop.md#commit-%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83)
- commit列表, 请在提交PR之前做好整理, 避免出现一个功能点的多条commit.[如何整理commit](https://help.github.com/en/articles/using-git-rebase-on-the-command-line)
# 如何提交PR
* fork项目到自己仓库
* git clone (您的仓库地址)到本地
* 建立上游源
* git remote add upStream git@github.com:alibaba/flutter-go.git
* 创建开发分支(非必须)
* git checkout -b develop
* 修改提交代码
* git status
* git add .
* git commit -m 'feat: message'
* git push origin develop
* 同步代码
* git fetch upstream
* git merge upstream/develop
* git push origin develop
* 提交PR
* 到自己github仓库对应fork的项目下new pull request

View File

@ -17,6 +17,7 @@ dependencies:
args: '^1.5.1' args: '^1.5.1'
dart_inquirer: '^1.0.0' dart_inquirer: '^1.0.0'
watcher: ^0.9.7+10 watcher: ^0.9.7+10
mustache: ^1.1.1
dev_dependencies: dev_dependencies:

View File

@ -1,11 +1,23 @@
import 'dart:io'; import 'dart:io';
import 'dart:convert'; import 'dart:convert';
import 'package:mustache/mustache.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import '../../utils/util.dart'; import '../../utils/util.dart';
import '../config.dart'; import '../config.dart';
import '../exception/demo.dart'; import '../exception/demo.dart';
String prettyJson(Map json) {
String res = "{";
json.forEach((k, v) {
res += (
"\t'$k': '$v'");
});
res +='}';
return res;
}
Future<List> buildPageListJson() async { Future<List> buildPageListJson() async {
List<FileSystemEntity> childList = await readeDirChildren(TARGET_PAGE_DIC, false); List<FileSystemEntity> childList = await readeDirChildren(TARGET_PAGE_DIC, false);
List<String> pagePathList = []; List<String> pagePathList = [];
@ -55,36 +67,45 @@ Future<List> buildPageListJson() async {
} }
String renderPagesDart(List<Map<String, dynamic>> data) { String renderPagesDart(List<Map<String, dynamic>> data) {
// 自定义前缀 避免出现数字非法字符等 print('data>>> $data');
String pre = "StandardPage"; var source = '''
String head = '';
String foot = """ {{# pages }}
import '{{ name }}_{{ author }}_{{ id }}/index.dart' as StandardPage_{{ name }}_{{ id }};
{{/ pages }}
class StandardPages { class StandardPages {
Map<String, String> standardPages; Map<String, String> standardPages;
Map<String, String> getPages() { Map<String, String> getPages() {
return { return {
"""; "0": "0" {{# pages }},
"{{ id }}" : StandardPage_{{ name }}_{{ id }}.getMd()
for (int i = 0; i < data.length; i++) { {{/ pages }}
Map<String, dynamic> item = data[i];
String demoImportName = '${item['name']}_${item['id']}';
head += "import '${item['name']}_${item['author']}_${item['id']}/index.dart' as ${pre}_$demoImportName;\r\n";
foot += "\t\t\t'${item['id']}': ${pre}_${demoImportName}.getMd()";
if (i != data.length - 1) {
foot += ',\r\n';
}
}
foot += """\r
}; };
} }
List<Map<String, String>> getLocalList() {
return [
{}{{# pages }},
{ "id": "{{ id }}", "name": "{{ name }}", "email": "{{ email }}", "author": "{{ author }}"}
{{/ pages }}
];
} }
"""; }
''';
var template = new Template(source, name: 'template-filename.html');
// 自定义前缀 避免出现数字非法字符等
Map<String, List> formatData = {
"pages": data
};
String output = template.renderString(formatData);
return output;
return head + foot;
} }
Future<bool> checkPage(String path) async { Future<bool> checkPage(String path) async {
List files = [ List files = [

View File

@ -6,6 +6,7 @@ import './version.dart';
import './command/create_demo.dart'; import './command/create_demo.dart';
import './command/create_page.dart'; import './command/create_page.dart';
import './command/watch_md.dart'; import './command/watch_md.dart';
import './command/build.dart';
@ -18,6 +19,7 @@ class _CommandRunner extends CommandRunner<int> {
addCommand(CreateDemoCommand()); addCommand(CreateDemoCommand());
addCommand(CreatePageCommand()); addCommand(CreatePageCommand());
addCommand(WatchCommand()); addCommand(WatchCommand());
addCommand(Build());
} }

View File

@ -0,0 +1,32 @@
//
// Created with Android Studio.
// User: 三帆
// Date: 30/07/2019
// Time: 16:51
// email: sanfan.hx@alibaba-inc.com
// target: build
//
import 'package:args/command_runner.dart';
import '../build/build_demo_list.dart';
import '../build/build_page_list.dart';
import 'dart:async';
class Build extends Command<int> {
@override
final name = 'build';
@override
final description = '生成索引等';
@override
Future<int> run() async {
buildPageListJson();
buildDemoListJson();
return 0;
}
}

View File

@ -1,3 +1,2 @@
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig" #include "Generated.xcconfig"
#include "../Pods/Target\ Support\ Files/Pods-Runner/Pods-Runner.debug.xcconfig"

View File

@ -1,3 +1,2 @@
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig" #include "Generated.xcconfig"
#include "../Pods/Target\ Support\ Files/Pods-Runner/Pods-Runner.release.xcconfig"

View File

@ -329,7 +329,7 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin\n"; shellScript = "/bin/sh \"/Users/nealyang/development/flutter/packages/flutter_tools/bin/xcode_backend.sh\" thin\n";
}; };
9740EEB61CF901F6004384FC /* Run Script */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;

View File

@ -9,9 +9,10 @@ import 'package:flutter_go/utils/example_code_parser.dart';
import 'package:flutter_go/utils/syntax_highlighter.dart'; import 'package:flutter_go/utils/syntax_highlighter.dart';
class FullScreenCodeDialog extends StatefulWidget { class FullScreenCodeDialog extends StatefulWidget {
const FullScreenCodeDialog({this.filePath}); const FullScreenCodeDialog({this.filePath, this.remoteFilePath});
final String filePath; final String filePath;
final String remoteFilePath;
_FullScreenCodeDialogState createState() => _FullScreenCodeDialogState(); _FullScreenCodeDialogState createState() => _FullScreenCodeDialogState();
} }

View File

@ -0,0 +1,94 @@
//
// Created with Android Studio.
// User: 三帆
// Date: 07/08/2019
// Time: 08:40
// email: sanfan.hx@alibaba-inc.com
// tartget: 代码获取自: https://blog.csdn.net/O_time/article/details/86496537
//
import 'dart:async';
import 'package:flutter/material.dart';
// ignore: must_be_immutable
class NetLoadingDialog extends StatefulWidget {
String loadingText;
bool outsideDismiss;
bool loading;
Function dismissCallback;
Future<dynamic> requestCallBack;
NetLoadingDialog(
{Key key,
this.loadingText = "loading...",
this.outsideDismiss = true,
this.dismissCallback,
this.loading,
this.requestCallBack})
: super(key: key);
@override
State<NetLoadingDialog> createState() => _LoadingDialog();
}
class _LoadingDialog extends State<NetLoadingDialog> {
_dismissDialog() {
if (widget.dismissCallback != null) {
widget.dismissCallback();
}
Navigator.of(context).pop();
}
@override
void initState() {
super.initState();
if (widget.requestCallBack != null) {
widget.requestCallBack.then((_) {
Navigator.pop(context);
});
}
}
@override
Widget build(BuildContext context) {
if (!widget.loading) {
return Container();
}
return new GestureDetector(
onTap: widget.outsideDismiss ? _dismissDialog : null,
child: Material(
type: MaterialType.transparency,
child: new Center(
child: new SizedBox(
width: 120.0,
height: 120.0,
child: new Container(
decoration: ShapeDecoration(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(8.0),
),
),
),
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
new CircularProgressIndicator(),
new Padding(
padding: const EdgeInsets.only(
top: 20.0,
),
child: new Text(
widget.loadingText,
style: new TextStyle(fontSize: 12.0),
),
),
],
),
),
),
),
),
);
}
}

View File

@ -25,8 +25,8 @@ class WidgetDemo extends StatefulWidget {
{Key key, {Key key,
@required this.title, @required this.title,
@required this.contentList, @required this.contentList,
@required this.codeUrl, this.codeUrl,
@required this.docUrl, this.docUrl,
this.bottomNaviBar}) this.bottomNaviBar})
: super(key: key); : super(key: key);
@ -141,7 +141,38 @@ class _WidgetDemoState extends State<WidgetDemo> {
'${Routes.codeView}?filePath=${Uri.encodeComponent(widget.codeUrl)}'); '${Routes.codeView}?filePath=${Uri.encodeComponent(widget.codeUrl)}');
} }
} }
List<PopupMenuEntry<String>> buildPopupMenu() {
List<PopupMenuEntry<String>> comps = [];
if (widget.docUrl != null) {
comps.add(
PopupMenuItem<String>(
value: 'doc',
child: ListTile(
leading: Icon(
Icons.library_books,
size: 22.0,
),
title: Text('查看文档'),
),
)
);
}
if (widget.codeUrl != null) {
comps.add(
PopupMenuItem<String>(
value: 'code',
child: ListTile(
leading: Icon(
Icons.code,
size: 22.0,
),
title: Text('查看Demo'),
),
)
);
}
return comps;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (_hasCollected) { if (_hasCollected) {
@ -149,11 +180,8 @@ class _WidgetDemoState extends State<WidgetDemo> {
} else { } else {
_collectionIcons = Icons.favorite_border; _collectionIcons = Icons.favorite_border;
} }
return Scaffold( List<PopupMenuEntry<String>> menus = buildPopupMenu();
key: _scaffoldKey, List<Widget> actions = [
appBar: AppBar(
title: Text(widget.title),
actions: <Widget>[
new IconButton( new IconButton(
tooltip: 'goBack home', tooltip: 'goBack home',
onPressed: () { onPressed: () {
@ -166,33 +194,20 @@ class _WidgetDemoState extends State<WidgetDemo> {
onPressed: _getCollection, onPressed: _getCollection,
icon: Icon(_collectionIcons), icon: Icon(_collectionIcons),
), ),
];
if (menus.length > 0) {
actions.add(
PopupMenuButton<String>( PopupMenuButton<String>(
onSelected: _selectValue, onSelected: _selectValue,
itemBuilder: (BuildContext context) => <PopupMenuEntry<String>>[ itemBuilder: (BuildContext context) => menus,
const PopupMenuItem<String>( )
value: 'doc', );
child: ListTile( }
leading: Icon( return Scaffold(
Icons.library_books, key: _scaffoldKey,
size: 22.0, appBar: AppBar(
), title: Text(widget.title),
title: Text('查看文档'), actions: actions,
),
),
const PopupMenuDivider(),
const PopupMenuItem<String>(
value: 'code',
child: ListTile(
leading: Icon(
Icons.code,
size: 22.0,
),
title: Text('查看Demo'),
),
),
],
),
],
), ),
body: Container( body: Container(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 15.0), padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 15.0),

View File

@ -17,7 +17,7 @@ import 'package:flutter_go/event/event_bus.dart';
import 'package:flutter_go/event/event_model.dart'; import 'package:flutter_go/event/event_model.dart';
import 'package:event_bus/event_bus.dart'; import 'package:event_bus/event_bus.dart';
import 'package:flutter_go/model/widget.dart'; import 'package:flutter_go/model/widget.dart';
import 'package:flutter_go/standard_pages/index.dart';
//import 'views/welcome_page/index.dart'; //import 'views/welcome_page/index.dart';
SpUtil sp; SpUtil sp;
@ -28,7 +28,6 @@ class MyApp extends StatefulWidget {
final router = new Router(); final router = new Router();
Routes.configureRoutes(router); Routes.configureRoutes(router);
// 这里设置项目环境 // 这里设置项目环境
Application.env = ENV.PRODUCTION;
Application.router = router; Application.router = router;
} }
@ -189,10 +188,13 @@ void main() async {
await provider.init(true); await provider.init(true);
sp = await SpUtil.getInstance(); sp = await SpUtil.getInstance();
new SearchHistoryList(sp); new SearchHistoryList(sp);
await DataUtils.getWidgetTreeList().then((List json) { await DataUtils.getWidgetTreeList().then((List json) {
if (json == null) return; List data = WidgetTree.insertDevPagesToList(json, StandardPages().getLocalList());
Application.widgetTree = WidgetTree.buildWidgetTree(json); Application.widgetTree = WidgetTree.buildWidgetTree(data);
print("Application.widgetTree>>>> ${Application.widgetTree}");
}); });
db = Provider.db; db = Provider.db;
runApp(new MyApp()); runApp(new MyApp());
} }

View File

@ -1,107 +1,107 @@
//
import 'dart:async'; //import 'dart:async';
//
import 'package:flutter_go/utils/sql.dart'; //import 'package:flutter_go/utils/sql.dart';
//
abstract class CatInterface{ //abstract class CatInterface{
int get id; // int get id;
//类目名称 // //类目名称
String get name; // String get name;
//描述 // //描述
String get desc; // String get desc;
//第几级类目,默认 1 // //第几级类目,默认 1
int get depth; // int get depth;
//父类目id没有为 0 // //父类目id没有为 0
int get parentId; // int get parentId;
} //}
//
class Cat implements CatInterface { //class Cat implements CatInterface {
int id; // int id;
String name; // String name;
String desc; // String desc;
int depth; // int depth;
int parentId; // int parentId;
//
Cat({this.id, this.name, this.desc, this.depth, this.parentId}); // Cat({this.id, this.name, this.desc, this.depth, this.parentId});
//
Cat.fromJSON(Map json) // Cat.fromJSON(Map json)
: id = json['id'], // : id = json['id'],
name = json['name'], // name = json['name'],
desc = json['desc'], // desc = json['desc'],
depth = json['depth'], // depth = json['depth'],
parentId = json['parentId']; // parentId = json['parentId'];
//
String toString() { // String toString() {
return '(Cat $name)'; // return '(Cat $name)';
} // }
//
Map toMap() { // Map toMap() {
return { // return {
'id': id, // 'id': id,
'name': name, // 'name': name,
'desc': desc, // 'desc': desc,
'depth': depth, // 'depth': depth,
'parentId': parentId // 'parentId': parentId
}; // };
} // }
Map toSqlCondition() { // Map toSqlCondition() {
Map _map = this.toMap(); // Map _map = this.toMap();
Map condition = {}; // Map condition = {};
_map.forEach((k, value) { // _map.forEach((k, value) {
//
if (value != null) { // if (value != null) {
//
condition[k] = value; // condition[k] = value;
} // }
}); // });
//
if (condition.isEmpty) { // if (condition.isEmpty) {
return {}; // return {};
} // }
//
return condition; // return condition;
} // }
} //}
//
//
class CatControlModel{ //class CatControlModel{
final String table = 'cat'; // final String table = 'cat';
Sql sql; // Sql sql;
CatControlModel() { // CatControlModel() {
sql = Sql.setTable(table); // sql = Sql.setTable(table);
} // }
//
/// 获取一级类目 // /// 获取一级类目
Future<List> mainList() async{ // Future<List> mainList() async{
List listJson = await sql.getByCondition(conditions: {'parentId': 0}); // List listJson = await sql.getByCondition(conditions: {'parentId': 0});
List<Cat> cats = listJson.map((json) { // List<Cat> cats = listJson.map((json) {
return new Cat.fromJSON(json); // return new Cat.fromJSON(json);
}).toList(); // }).toList();
return cats; // return cats;
} // }
//
// 获取Cat不同深度与parent的列表 // // 获取Cat不同深度与parent的列表
Future<List<Cat>> getList([Cat cat]) async{ // Future<List<Cat>> getList([Cat cat]) async{
//
//
if (cat == null) { // if (cat == null) {
cat = new Cat(depth: 1, parentId: 0); // cat = new Cat(depth: 1, parentId: 0);
} // }
// print("cat in getList ${cat.toMap()}"); // // print("cat in getList ${cat.toMap()}");
List listJson = await sql.getByCondition(conditions: cat.toSqlCondition()); // List listJson = await sql.getByCondition(conditions: cat.toSqlCondition());
List<Cat> cats = listJson.map((json) { // List<Cat> cats = listJson.map((json) {
return new Cat.fromJSON(json); // return new Cat.fromJSON(json);
}).toList(); // }).toList();
return cats; // return cats;
} // }
//
// 通过name获取Cat对象信息 // // 通过name获取Cat对象信息
Future<Cat> getCatByName(String name) async { // Future<Cat> getCatByName(String name) async {
List json = await sql.getByCondition(conditions: {'name': name}); // List json = await sql.getByCondition(conditions: {'name': name});
if (json.isEmpty) { // if (json.isEmpty) {
return null; // return null;
} // }
return new Cat.fromJSON(json.first); // return new Cat.fromJSON(json.first);
} // }
//
} //}

View File

@ -2,7 +2,7 @@
import 'dart:async'; import 'dart:async';
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_go/routers/application.dart";
import 'package:flutter_go/utils/sql.dart'; import 'package:flutter_go/utils/sql.dart';
enum treeNode { enum treeNode {
@ -188,10 +188,12 @@ class CategoryComponent extends CommonItem {
@required this.id, @required this.id,
@required this.name, @required this.name,
@required this.parentId, @required this.parentId,
this.type = 'categoryw',
this.children, this.children,
this.parent this.parent
}); });
CategoryComponent.fromJson(Map json) { CategoryComponent.fromJson(Map json) {
print(json['id'].runtimeType);
this.id = json['id']; this.id = json['id'];
this.name = json['name']; this.name = json['name'];
this.parentId = json['parentId']; this.parentId = json['parentId'];
@ -289,6 +291,7 @@ class WidgetLeaf extends CommonItem {
} }
class WidgetTree { class WidgetTree {
// 构建树型结构
static CategoryComponent buildWidgetTree(List json, [parent]){ static CategoryComponent buildWidgetTree(List json, [parent]){
CategoryComponent current; CategoryComponent current;
if (parent != null) { if (parent != null) {
@ -297,7 +300,6 @@ class WidgetTree {
current = CategoryComponent(id: 0, name: 'root', parentId: null, children: []); current = CategoryComponent(id: 0, name: 'root', parentId: null, children: []);
} }
json.forEach((item) { json.forEach((item) {
// 归属分类级别 // 归属分类级别
if (['root', 'category'].indexOf(item['type']) != -1) { if (['root', 'category'].indexOf(item['type']) != -1) {
CategoryComponent cate = CategoryComponent.fromJson(item); CategoryComponent cate = CategoryComponent.fromJson(item);
@ -313,6 +315,41 @@ class WidgetTree {
}); });
return current; return current;
} }
static insertDevPagesToList(List list, List devPages) {
List devChildren = [];
int index = 9999999;
if (Application.env == ENV.PRODUCTION) {
return list;
}
devPages.forEach((item) {
index++;
if (item['id'] != null) {
devChildren.add({
"id": index.toString(),
"name": item['name'],
"parentId": "99999999999",
"type": "widget",
"display": "standard",
"author": item['author'],
"pageId": item['id']
});
}
});
list.forEach((item) {
if (item['name'].toString().toUpperCase() == 'DEVELOPER') {
List children = item['children'];
children.insert(0, {
"id": "99999999999",
"name": "本地代码",
"parentId": item['id'],
"type": "category",
"children": devChildren
});
}
});
return list;
}
static CategoryComponent getCommonItemById(List<int> path, CategoryComponent root) { static CategoryComponent getCommonItemById(List<int> path, CategoryComponent root) {
print("getCommonItemByPath $path"); print("getCommonItemByPath $path");
print("root $root"); print("root $root");

View File

@ -1 +1 @@
[{"name":"demoName","screenShot":"","author":"yourName","email":"yourEmail","desc":"这是一个测试的标准demo","id":"1a29aa8e_32ae_4241_9c8a_5c9e1f92b096"}] [{"name":"demoName","screenShot":"","author":"yourName","email":"yourEmail","desc":"这是一个测试的标准demo","id":"1a29aa8e_32ae_4241_9c8a_5c9e1f92b096"},{"name":"local","screenShot":"","author":"ab","email":"email","desc":"ags","id":"2c1d57d0_42ae_4241_9c8a_5c9e1f92b096"}]

View File

@ -1,4 +1,6 @@
import 'demoName_yourName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardDemo_demoName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096; import 'demoName_yourName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardDemo_demoName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096;
import 'local_ab_2c1d57d0_42ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardDemo_local_2c1d57d0_42ae_4241_9c8a_5c9e1f92b096;
var demoObjects = { var demoObjects = {
'1a29aa8e_32ae_4241_9c8a_5c9e1f92b096': StandardDemo_demoName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096.demoWidgets '1a29aa8e_32ae_4241_9c8a_5c9e1f92b096': StandardDemo_demoName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096.demoWidgets,
'2c1d57d0_42ae_4241_9c8a_5c9e1f92b096': StandardDemo_local_2c1d57d0_42ae_4241_9c8a_5c9e1f92b096.demoWidgets
}; };

View File

@ -0,0 +1,9 @@
{
"name": "local",
"screenShot": "",
"author":"ab",
"email": "email",
"desc": "ags",
"id": "2c1d57d0_42ae_4241_9c8a_5c9e1f92b096"
}

View File

@ -0,0 +1,15 @@
//
// Created with flutter go cli
// User: ab
// Time: 2019-08-06 17:26:02.905889
// email: email
// desc: ags
//
import 'src/index.dart';
var demoWidgets = [
new Demo()
];

View File

@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
class Demo extends StatefulWidget {
@override
_State createState() => _State();
}
class _State extends State<Demo> {
@override
Widget build(BuildContext context) {
return Container(
child: Text("this is flutter go init demo"),
);
}
}

View File

@ -10,6 +10,7 @@ class Routes {
static String home = "/home"; static String home = "/home";
static String widgetDemo = '/widget-demo'; static String widgetDemo = '/widget-demo';
static String codeView = '/code-view'; static String codeView = '/code-view';
static String githubCodeView = '/github-code-view';
static String webViewPage = '/web-view-page'; static String webViewPage = '/web-view-page';
static String loginPage = '/loginpage'; static String loginPage = '/loginpage';
static String issuesMessage='/issuesMessage'; static String issuesMessage='/issuesMessage';

View File

@ -1,11 +1 @@
[ [{"name":"local","screenShot":"","author":"hnaxu","title":"本地","email":"hanxu@qq.com","desc":"desc","id":"5d7178d0_42ae_4241_9c8a_5c9e1f92b096"},{"name":"test","screenShot":"","author":"abc","title":"ya","email":"adsf.com","desc":"desc","id":"84f38e00_42ae_4241_9c8a_5c9e1f92b096"},{"name":"standard","screenShot":"","author":"sanfan","title":"介绍页","email":"hanxu317@qq.com","desc":"desc","id":"ee4feb8e_32ae_4241_9c8a_5c9e1f92b096"}]
{
"name": "standard",
"screenShot": "",
"author": "sanfan",
"title": "介绍页",
"email": "hanxu317@qq.com",
"desc": "desc",
"id": "ee4feb8e_32ae_4241_9c8a_5c9e1f92b096"
}
]

View File

@ -1,11 +1,30 @@
import 'local_hnaxu_5d7178d0_42ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardPage_local_5d7178d0_42ae_4241_9c8a_5c9e1f92b096;
import 'test_abc_84f38e00_42ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardPage_test_84f38e00_42ae_4241_9c8a_5c9e1f92b096;
import 'standard_sanfan_ee4feb8e_32ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardPage_standard_ee4feb8e_32ae_4241_9c8a_5c9e1f92b096; import 'standard_sanfan_ee4feb8e_32ae_4241_9c8a_5c9e1f92b096/index.dart' as StandardPage_standard_ee4feb8e_32ae_4241_9c8a_5c9e1f92b096;
class StandardPages { class StandardPages {
Map<String, String> standardPages; Map<String, String> standardPages;
Map<String, String> getPages() { Map<String, String> getPages() {
return { return {
'ee4feb8e_32ae_4241_9c8a_5c9e1f92b096': StandardPage_standard_ee4feb8e_32ae_4241_9c8a_5c9e1f92b096.getMd() "0": "0" ,
"5d7178d0_42ae_4241_9c8a_5c9e1f92b096" : StandardPage_local_5d7178d0_42ae_4241_9c8a_5c9e1f92b096.getMd()
,
"84f38e00_42ae_4241_9c8a_5c9e1f92b096" : StandardPage_test_84f38e00_42ae_4241_9c8a_5c9e1f92b096.getMd()
,
"ee4feb8e_32ae_4241_9c8a_5c9e1f92b096" : StandardPage_standard_ee4feb8e_32ae_4241_9c8a_5c9e1f92b096.getMd()
}; };
} }
List<Map<String, String>> getLocalList() {
return [
{},
{ "id": "5d7178d0_42ae_4241_9c8a_5c9e1f92b096", "name": "local", "email": "hanxu@qq.com", "author": "hnaxu"}
,
{ "id": "84f38e00_42ae_4241_9c8a_5c9e1f92b096", "name": "test", "email": "adsf.com", "author": "abc"}
,
{ "id": "ee4feb8e_32ae_4241_9c8a_5c9e1f92b096", "name": "standard", "email": "hanxu317@qq.com", "author": "sanfan"}
];
}
} }

View File

@ -0,0 +1,10 @@
{
"name": "local",
"screenShot": "",
"author":"hnaxu",
"title":"本地",
"email": "hanxu@qq.com",
"desc": "desc",
"id": "5d7178d0_42ae_4241_9c8a_5c9e1f92b096"
}

View File

@ -0,0 +1,52 @@
String getMd() {
return """
# 标准的详情页
您可以在这个界面中, 编写大多数的markdown文案, 他会在 **goCli watch** 下同步被编译成 **dart** 文件
您可以通过goCli创建详情页所需要的demo
```
goCLi createDemo
```
在flutter go 根文件下通过命令行输入以上命令可以进行以下操作
[✓] 请输入新增加的demo名称? demoName
[✓] 请输入您的姓名(使用英文) yourName
[✓] 请输入您的github的email地址 yourEmail
[✓] 请输入您demo的描述 这是一个测试的标准demo
在完成以上操作后, 可以得到这样的输出:
```
------------------
您新增的组件信息如下
==================
{
name : demoName
author : yourName
email : yourEmail
desc : 这是一个测试的标准demo
}
==================
[✓] Is this the config you want ? (Y/n) y
{
新建的demo文件位于 : /flutter go/lib/page_demo_package/demoName_yourName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
demoId为 : 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
markdown中调用方式 : [demo:1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
}
```
您可以在任意详情页中, 通过以下方式调用
```
[demo: 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
```""";
}

View File

@ -0,0 +1,48 @@
# 标准的详情页
您可以在这个界面中, 编写大多数的markdown文案, 他会在 **goCli watch** 下同步被编译成 **dart** 文件
您可以通过goCli创建详情页所需要的demo
```
goCLi createDemo
```
在flutter go 根文件下通过命令行输入以上命令可以进行以下操作
[✓] 请输入新增加的demo名称? demoName
[✓] 请输入您的姓名(使用英文) yourName
[✓] 请输入您的github的email地址 yourEmail
[✓] 请输入您demo的描述 这是一个测试的标准demo
在完成以上操作后, 可以得到这样的输出:
```
------------------
您新增的组件信息如下
==================
{
name : demoName
author : yourName
email : yourEmail
desc : 这是一个测试的标准demo
}
==================
[✓] Is this the config you want ? (Y/n) y
{
新建的demo文件位于 : /flutter go/lib/page_demo_package/demoName_yourName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
demoId为 : 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
markdown中调用方式 : [demo:1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
}
```
您可以在任意详情页中, 通过以下方式调用
```
[demo: 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
```

View File

@ -0,0 +1,10 @@
{
"name": "test",
"screenShot": "",
"author":"abc",
"title":"ya",
"email": "adsf.com",
"desc": "desc",
"id": "84f38e00_42ae_4241_9c8a_5c9e1f92b096"
}

View File

@ -0,0 +1,52 @@
String getMd() {
return """
# 标准的详情页
您可以在这个界面中, 编写大多数的markdown文案, 他会在 **goCli watch** 下同步被编译成 **dart** 文件
您可以通过goCli创建详情页所需要的demo
```
goCLi createDemo
```
在flutter go 根文件下通过命令行输入以上命令可以进行以下操作
[✓] 请输入新增加的demo名称? demoName
[✓] 请输入您的姓名(使用英文) yourName
[✓] 请输入您的github的email地址 yourEmail
[✓] 请输入您demo的描述 这是一个测试的标准demo
在完成以上操作后, 可以得到这样的输出:
```
------------------
您新增的组件信息如下
==================
{
name : demoName
author : yourName
email : yourEmail
desc : 这是一个测试的标准demo
}
==================
[✓] Is this the config you want ? (Y/n) y
{
新建的demo文件位于 : /flutter go/lib/page_demo_package/demoName_yourName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
demoId为 : 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
markdown中调用方式 : [demo:1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
}
```
您可以在任意详情页中, 通过以下方式调用
```
[demo: 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
```""";
}

View File

@ -0,0 +1,48 @@
# 标准的详情页
您可以在这个界面中, 编写大多数的markdown文案, 他会在 **goCli watch** 下同步被编译成 **dart** 文件
您可以通过goCli创建详情页所需要的demo
```
goCLi createDemo
```
在flutter go 根文件下通过命令行输入以上命令可以进行以下操作
[✓] 请输入新增加的demo名称? demoName
[✓] 请输入您的姓名(使用英文) yourName
[✓] 请输入您的github的email地址 yourEmail
[✓] 请输入您demo的描述 这是一个测试的标准demo
在完成以上操作后, 可以得到这样的输出:
```
------------------
您新增的组件信息如下
==================
{
name : demoName
author : yourName
email : yourEmail
desc : 这是一个测试的标准demo
}
==================
[✓] Is this the config you want ? (Y/n) y
{
新建的demo文件位于 : /flutter go/lib/page_demo_package/demoName_yourName_1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
demoId为 : 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096
markdown中调用方式 : [demo:1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
}
```
您可以在任意详情页中, 通过以下方式调用
```
[demo: 1a29aa8e_32ae_4241_9c8a_5c9e1f92b096]
```

View File

@ -109,7 +109,7 @@ class DataUtils {
static Future<List> getWidgetTreeList() async { static Future<List> getWidgetTreeList() async {
try { try {
var response = await NetUtils.get(Api.GET_WIDGET_TREE); var response = await NetUtils.get(Api.GET_WIDGET_TREE);
print('组件树:$response'); print('组件树dddd$response');
if (response != null && response['success']) { if (response != null && response['success']) {
return response['data']; return response['data'];
} else { } else {

View File

@ -1,12 +0,0 @@
const title = 'titie1';
Map<String, String> titleObjs = {
'title': 'haha33'
};
class Maps {
Map<String, String> list;
getList() {
return {
"title": "1111"
};
}
}

View File

@ -15,6 +15,13 @@ import '../../components/flutter_markdown/lib/flutter_markdown.dart';
import '../../standard_pages/index.dart'; import '../../standard_pages/index.dart';
import '../../page_demo_package/index.dart'; import '../../page_demo_package/index.dart';
import 'package:flutter_go/routers/application.dart'; import 'package:flutter_go/routers/application.dart';
import 'package:flutter_go/utils/net_utils.dart';
import 'package:flutter_go/components/loading.dart';
const githubUrl = 'https://raw.githubusercontent.com/alibaba/flutter-go/beta/lib/standard_pages/';
const PagesUrl = 'https://raw.githubusercontent.com/alibaba/flutter-go/beta/lib/standard_pages/.pages.json';
const DemosUrl = 'https://raw.githubusercontent.com/alibaba/flutter-go/beta/lib/page_demo_package/.demo.json';
// ONLINE || LOCAL // ONLINE || LOCAL
ENV env = Application.env; ENV env = Application.env;
@ -28,25 +35,24 @@ class StandardView extends StatefulWidget {
} }
class _StandardView extends State<StandardView> { class _StandardView extends State<StandardView> {
String markdownDesc = '# this is header'; String markdownDesc = '';
String pageTitle = "XXX"; String pageTitle = '';
bool isLoading = false;
String author = ''; String author = '';
String email = ''; String email = '';
StandardPages standardPage = new StandardPages(); StandardPages standardPage = new StandardPages();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
this.getDetail(); this.getPageInfo();
} }
// 本地调用的获取基本信息 /// 本地调用的获取文章属性的基本信息
Future<void> getPagesInfo() async { Future<void> localGetPagesAttrsInfo() async {
String jsonString = await DefaultAssetBundle.of(context) String jsonString = await DefaultAssetBundle.of(context).loadString('lib/standard_pages/.pages.json');
.loadString('lib/standard_pages/.pages.json');
List jsonList = json.decode(jsonString); List jsonList = json.decode(jsonString);
Map<String, dynamic> pageDetail = Map<String, dynamic> pageDetail = jsonList.firstWhere((item) => item['id'] == widget.id);
jsonList.firstWhere((item) => item['id'] == widget.id);
if (pageDetail != null) { if (pageDetail != null) {
setState(() { setState(() {
pageTitle = pageDetail['title'] ?? '请加入title'; pageTitle = pageDetail['title'] ?? '请加入title';
@ -56,27 +62,56 @@ class _StandardView extends State<StandardView> {
} }
} }
String _getContentFromLocal() { /// 从本地获取基本文章信息
String localGetPagesMarkdown() {
String pageId = widget.id; String pageId = widget.id;
Map<String, String> pagesList = standardPage.getPages(); Map<String, String> pagesList = standardPage.getPages();
return pagesList[pageId]; return pagesList[pageId];
} }
Future<String> getContentOnline() async {
Future<String> _getContentOnline() async {
String content = 'online content'; String content = 'online content';
this.setState(() {
isLoading = true;
});
return Future(() => content); List response = jsonDecode(await NetUtils.get(PagesUrl));
Map targetPage = response.firstWhere((page) => page['id'] == widget.id);
if (targetPage == null) {
setState(() {
isLoading = false;
});
return Future(() => '未获取界面相当信息');
} }
setState(() {
pageTitle = targetPage['title'] ?? 'xxx';
author = targetPage['author'];
email = targetPage['email'];
});
Future<String> getDetail() async { String pageName = targetPage['name'] + "_" +targetPage['author']+ "_" +targetPage['id'];
String pageContent = await NetUtils.get(githubUrl + pageName + "/index.md");
setState(() {
isLoading = false;
});
return Future(() => pageContent);
}
/// 获取当面界面的相关信息. 需要区分环境
/// 本地环境下, 从本地获取 standard_pages的目录中互殴
/// 线上环境. 从github的api中获取
Future<String> getPageInfo() async {
String conent = ''; String conent = '';
print("env:::: $env"); print("env:::: $env");
if (env == ENV.PRODUCTION) { if (env == ENV.PRODUCTION) {
conent = await _getContentOnline(); conent = await getContentOnline();
} else { } else {
getPagesInfo(); conent = localGetPagesMarkdown();
conent = _getContentFromLocal(); localGetPagesAttrsInfo();
} }
if (this.mounted) { if (this.mounted) {
setState(() { setState(() {
@ -84,18 +119,32 @@ class _StandardView extends State<StandardView> {
}); });
} }
return Future(() => conent); return Future(() => conent);
// this.rebuild(); }
Widget buildFootInfo() {
if (!isLoading) {
return Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text('创建者: $author'),
Text('邮箱: $email'),
Text('界面id: ${widget.id}')
],
),
);
}
return Container();
} }
Widget buildMarkdown() { Widget buildMarkdown() {
Map<String, String> contentList = new StandardPages().getPages();
if (contentList[widget.id] == null) {
contentList[widget.id] = ''; if (markdownDesc == null) {
return null;
} }
return MarkdownBody( return MarkdownBody(
data: contentList[widget.id], data: markdownDesc,
syntaxHighlighter:new mdCopy.HighLight(), syntaxHighlighter:new mdCopy.HighLight(),
demoBuilder: (Map<String, dynamic> attrs) { demoBuilder: (Map<String, dynamic> attrs) {
List<Widget> demo = demoObjects[attrs['id']]; List<Widget> demo = demoObjects[attrs['id']];
@ -109,20 +158,22 @@ class _StandardView extends State<StandardView> {
}); });
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return new WidgetDemo( return new WidgetDemo(
title: pageTitle, title: pageTitle,
codeUrl: 'elements/Form/Button/DropdownButton/demo.dart', // codeUrl: 'elements/Form/Button/DropdownButton/demo.dart',
contentList: [ contentList: [
NetLoadingDialog(
loading: isLoading,
outsideDismiss: false,
),
buildMarkdown(), buildMarkdown(),
SizedBox(height: 30), SizedBox(height: 30),
'创建者: $author', buildFootInfo(),
'创建者: $email', SizedBox(height: 30)
'id: ${widget.id}',
], ],
docUrl:
'https://docs.flutter.io/flutter/material/DropdownButton-class.html',
); );
} }
} }

View File

@ -53,7 +53,6 @@ class SecondPageState extends State<WidgetPage> with AutomaticKeepAliveClientMix
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
print("build in widget page");
return Container( return Container(
color: Theme.of(context).backgroundColor, color: Theme.of(context).backgroundColor,
child: this.buildGrid(), child: this.buildGrid(),

View File

@ -5,105 +5,105 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: args name: args
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.5.2" version: "1.5.2"
async: async:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.0" version: "2.2.0"
bloc: bloc:
dependency: "direct main" dependency: "direct main"
description: description:
name: bloc name: bloc
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.0" version: "0.12.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
name: charcode name: charcode
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
city_pickers: city_pickers:
dependency: "direct main" dependency: "direct main"
description: description:
name: city_pickers name: city_pickers
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4" version: "0.0.4"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.14.11" version: "1.14.11"
cookie_jar: cookie_jar:
dependency: "direct main" dependency: "direct main"
description: description:
name: cookie_jar name: cookie_jar
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
csslib: csslib:
dependency: transitive dependency: transitive
description: description:
name: csslib name: csslib
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.16.1" version: "0.16.1"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.2" version: "0.1.2"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio name: dio
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.13" version: "2.1.13"
event_bus: event_bus:
dependency: "direct main" dependency: "direct main"
description: description:
name: event_bus name: event_bus
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
firebase_analytics: firebase_analytics:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_analytics name: firebase_analytics
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0+1" version: "1.2.0+1"
firebase_core: firebase_core:
dependency: "direct main" dependency: "direct main"
description: description:
name: firebase_core name: firebase_core
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.4" version: "0.3.4"
fluro: fluro:
dependency: "direct main" dependency: "direct main"
description: description:
name: fluro name: fluro
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.5.1" version: "1.5.1"
flutter: flutter:
@ -115,28 +115,28 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_bloc name: flutter_bloc
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.11.1" version: "0.11.1"
flutter_downloader: flutter_downloader:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_downloader name: flutter_downloader
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.9" version: "1.1.9"
flutter_jpush: flutter_jpush:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_jpush name: flutter_jpush
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4" version: "0.0.4"
flutter_spinkit: flutter_spinkit:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_spinkit name: flutter_spinkit
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
flutter_test: flutter_test:
@ -148,154 +148,154 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_webview_plugin name: flutter_webview_plugin
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.5" version: "0.3.5"
fluttertoast: fluttertoast:
dependency: "direct main" dependency: "direct main"
description: description:
name: fluttertoast name: fluttertoast
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
html: html:
dependency: "direct main" dependency: "direct main"
description: description:
name: html name: html
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.14.0+2" version: "0.14.0+2"
image_picker: image_picker:
dependency: "direct main" dependency: "direct main"
description: description:
name: image_picker name: image_picker
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.5.4+3" version: "0.5.4+3"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
name: intl name: intl
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.15.7" version: "0.15.7"
lpinyin: lpinyin:
dependency: transitive dependency: transitive
description: description:
name: lpinyin name: lpinyin
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.7" version: "1.0.7"
markdown: markdown:
dependency: "direct main" dependency: "direct main"
description: description:
name: markdown name: markdown
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.5" version: "0.12.5"
meta: meta:
dependency: "direct main" dependency: "direct main"
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.6" version: "1.1.6"
notus: notus:
dependency: transitive dependency: transitive
description: description:
name: notus name: notus
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "0.1.3"
open_file: open_file:
dependency: "direct main" dependency: "direct main"
description: description:
name: open_file name: open_file
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
package_info: package_info:
dependency: "direct main" dependency: "direct main"
description: description:
name: package_info name: package_info
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.0+6" version: "0.4.0+6"
path: path:
dependency: "direct main" dependency: "direct main"
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.6.2" version: "1.6.2"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
name: path_provider name: path_provider
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
pedantic: pedantic:
dependency: transitive dependency: transitive
description: description:
name: pedantic name: pedantic
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.7.0" version: "1.7.0"
permission_handler: permission_handler:
dependency: "direct main" dependency: "direct main"
description: description:
name: permission_handler name: permission_handler
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.1+1" version: "3.2.1+1"
quill_delta: quill_delta:
dependency: transitive dependency: transitive
description: description:
name: quill_delta name: quill_delta
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
quiver: quiver:
dependency: transitive dependency: transitive
description: description:
name: quiver name: quiver
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
quiver_hashcode: quiver_hashcode:
dependency: transitive dependency: transitive
description: description:
name: quiver_hashcode name: quiver_hashcode
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
rxdart: rxdart:
dependency: transitive dependency: transitive
description: description:
name: rxdart name: rxdart
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.21.0" version: "0.21.0"
share: share:
dependency: "direct main" dependency: "direct main"
description: description:
name: share name: share
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.2+1" version: "0.6.2+1"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.3" version: "0.4.3"
sky_engine: sky_engine:
@ -307,77 +307,77 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.5.5" version: "1.5.5"
sqflite: sqflite:
dependency: "direct main" dependency: "direct main"
description: description:
name: sqflite name: sqflite
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.6+3" version: "1.1.6+3"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.9.3" version: "1.9.3"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
string_scanner: string_scanner:
dependency: "direct main" dependency: "direct main"
description: description:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
synchronized: synchronized:
dependency: transitive dependency: transitive
description: description:
name: synchronized name: synchronized
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0+1" version: "2.1.0+1"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.5" version: "0.2.5"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.6" version: "1.1.6"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
name: url_launcher name: url_launcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.2" version: "5.1.2"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.8" version: "2.0.8"
zefyr: zefyr: