Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
sxychenjing
engine
提交
3f55a95d
E
engine
项目概览
sxychenjing
/
engine
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
engine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
3f55a95d
编写于
7月 20, 2015
作者:
C
Collin Jackson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add basic measurement functionality to fitness app
上级
a548d390
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
235 addition
and
17 deletion
+235
-17
sky/sdk/example/fitness/lib/home.dart
sky/sdk/example/fitness/lib/home.dart
+95
-9
sky/sdk/example/fitness/lib/main.dart
sky/sdk/example/fitness/lib/main.dart
+28
-2
sky/sdk/example/fitness/lib/measurement.dart
sky/sdk/example/fitness/lib/measurement.dart
+103
-1
sky/sdk/lib/widgets/snack_bar.dart
sky/sdk/lib/widgets/snack_bar.dart
+3
-1
sky/sdk/lib/widgets/tool_bar.dart
sky/sdk/lib/widgets/tool_bar.dart
+6
-4
未找到文件。
sky/sdk/example/fitness/lib/home.dart
浏览文件 @
3f55a95d
...
...
@@ -4,6 +4,9 @@
import
'package:sky/painting/text_style.dart'
;
import
'package:sky/widgets/basic.dart'
;
import
'package:sky/widgets/card.dart'
;
import
'package:sky/widgets/default_text_style.dart'
;
import
'package:sky/widgets/dismissable.dart'
;
import
'package:sky/widgets/drawer.dart'
;
import
'package:sky/widgets/drawer_divider.dart'
;
import
'package:sky/widgets/drawer_header.dart'
;
...
...
@@ -11,9 +14,11 @@ import 'package:sky/widgets/drawer_item.dart';
import
'package:sky/widgets/floating_action_button.dart'
;
import
'package:sky/widgets/icon_button.dart'
;
import
'package:sky/widgets/icon.dart'
;
import
'package:sky/widgets/ink_well.dart'
;
import
'package:sky/widgets/material.dart'
;
import
'package:sky/widgets/navigator.dart'
;
import
'package:sky/widgets/scaffold.dart'
;
import
'package:sky/widgets/scrollable_list.dart'
;
import
'package:sky/widgets/snack_bar.dart'
;
import
'package:sky/widgets/theme.dart'
;
import
'package:sky/widgets/tool_bar.dart'
;
...
...
@@ -22,12 +27,79 @@ import 'package:sky/widgets/widget.dart';
import
'fitness_types.dart'
;
import
'measurement.dart'
;
class
MeasurementList
extends
Component
{
MeasurementList
({
String
key
,
this
.
measurements
,
this
.
onDismissed
})
:
super
(
key:
key
);
final
List
<
Measurement
>
measurements
;
final
MeasurementHandler
onDismissed
;
Widget
build
()
{
return
new
Material
(
type:
MaterialType
.
canvas
,
child:
new
ScrollableList
<
Measurement
>(
items:
measurements
,
itemHeight:
MeasurementRow
.
kHeight
,
itemBuilder:
(
measurement
)
=>
new
MeasurementRow
(
measurement:
measurement
,
onDismissed:
onDismissed
)
)
);
}
}
class
MeasurementRow
extends
Component
{
MeasurementRow
({
Measurement
measurement
,
this
.
onDismissed
})
:
this
.
measurement
=
measurement
,
super
(
key:
measurement
.
when
.
toString
());
final
Measurement
measurement
;
final
MeasurementHandler
onDismissed
;
static
const
double
kHeight
=
79.0
;
Widget
build
()
{
List
<
Widget
>
children
=
[
new
Flexible
(
child:
new
Text
(
measurement
.
displayWeight
,
style:
const
TextStyle
(
textAlign:
TextAlign
.
right
)
)
),
new
Flexible
(
child:
new
Text
(
measurement
.
displayDate
,
style:
Theme
.
of
(
this
).
text
.
caption
.
copyWith
(
textAlign:
TextAlign
.
right
)
)
)
];
return
new
Dismissable
(
key:
measurement
.
when
.
toString
(),
onDismissed:
()
=>
onDismissed
(
measurement
),
child:
new
Card
(
child:
new
Container
(
height:
kHeight
,
padding:
const
EdgeDims
.
all
(
8.0
),
child:
new
Flex
(
children
,
alignItems:
FlexAlignItems
.
baseline
,
textBaseline:
DefaultTextStyle
.
of
(
this
).
textBaseline
)
)
)
);
}
}
class
HomeFragment
extends
StatefulComponent
{
HomeFragment
(
this
.
navigator
,
this
.
userData
);
HomeFragment
(
{
this
.
navigator
,
this
.
userData
,
this
.
onMeasurementCreated
,
this
.
onMeasurementDeleted
}
);
Navigator
navigator
;
List
<
Measurement
>
userData
;
MeasurementHandler
onMeasurementCreated
;
MeasurementHandler
onMeasurementDeleted
;
FitnessMode
_fitnessMode
=
FitnessMode
.
measure
;
...
...
@@ -40,6 +112,8 @@ class HomeFragment extends StatefulComponent {
void
syncFields
(
HomeFragment
source
)
{
navigator
=
source
.
navigator
;
userData
=
source
.
userData
;
onMeasurementCreated
=
source
.
onMeasurementCreated
;
onMeasurementDeleted
=
source
.
onMeasurementDeleted
;
}
bool
_isShowingSnackBar
=
false
;
...
...
@@ -121,10 +195,26 @@ class HomeFragment extends StatefulComponent {
);
}
// TODO(jackson): Pull from file
Measurement
_undoMeasurement
;
void
_handleMeasurementDismissed
(
Measurement
measurement
)
{
onMeasurementDeleted
(
measurement
);
setState
(()
{
_undoMeasurement
=
measurement
;
_isShowingSnackBar
=
true
;
});
}
Widget
buildBody
()
{
TextStyle
style
=
Theme
.
of
(
this
).
text
.
title
;
switch
(
_fitnessMode
)
{
case
FitnessMode
.
measure
:
if
(
userData
.
length
>
0
)
return
new
MeasurementList
(
measurements:
userData
,
onDismissed:
_handleMeasurementDismissed
);
return
new
Material
(
type:
MaterialType
.
canvas
,
child:
new
Flex
(
...
...
@@ -143,7 +233,9 @@ class HomeFragment extends StatefulComponent {
}
void
_handleUndo
()
{
onMeasurementCreated
(
_undoMeasurement
);
setState
(()
{
_undoMeasurement
=
null
;
_isShowingSnackBar
=
false
;
});
}
...
...
@@ -152,17 +244,11 @@ class HomeFragment extends StatefulComponent {
if
(!
_isShowingSnackBar
)
return
null
;
return
new
SnackBar
(
content:
new
Text
(
"Measurement
added!
"
),
content:
new
Text
(
"Measurement
deleted.
"
),
actions:
[
new
SnackBarAction
(
label:
"UNDO"
,
onPressed:
_handleUndo
)]
);
}
void
_handleMeasurementAdded
()
{
setState
(()
{
_isShowingSnackBar
=
true
;
});
}
void
_handleRunStarted
()
{
setState
(()
{
_isRunning
=
true
;
...
...
@@ -180,7 +266,7 @@ class HomeFragment extends StatefulComponent {
case
FitnessMode
.
measure
:
return
new
FloatingActionButton
(
child:
new
Icon
(
type:
'content/add'
,
size:
24
),
onPressed:
_handleMeasurementAdded
onPressed:
()
=>
navigator
.
pushNamed
(
"/measurements/new"
)
);
case
FitnessMode
.
run
:
return
new
FloatingActionButton
(
...
...
sky/sdk/example/fitness/lib/main.dart
浏览文件 @
3f55a95d
...
...
@@ -22,7 +22,19 @@ class FitnessApp extends App {
_navigationState
=
new
NavigationState
([
new
Route
(
name:
'/'
,
builder:
(
navigator
,
route
)
=>
new
HomeFragment
(
navigator
,
_userData
)
builder:
(
navigator
,
route
)
=>
new
HomeFragment
(
navigator:
navigator
,
userData:
_userData
,
onMeasurementCreated:
_handleMeasurementCreated
,
onMeasurementDeleted:
_handleMeasurementDeleted
)
),
new
Route
(
name:
'/measurements/new'
,
builder:
(
navigator
,
route
)
=>
new
MeasurementFragment
(
navigator:
navigator
,
onCreated:
_handleMeasurementCreated
)
),
new
Route
(
name:
'/settings'
,
...
...
@@ -42,6 +54,19 @@ class FitnessApp extends App {
}
}
void
_handleMeasurementCreated
(
Measurement
measurement
)
{
setState
(()
{
_userData
.
add
(
measurement
);
_userData
.
sort
((
a
,
b
)
=>
a
.
when
.
compareTo
(
b
.
when
));
});
}
void
_handleMeasurementDeleted
(
Measurement
measurement
)
{
setState
(()
{
_userData
.
remove
(
measurement
);
});
}
BackupMode
backupSetting
=
BackupMode
.
disabled
;
void
settingsUpdater
({
BackupMode
backup
})
{
...
...
@@ -52,7 +77,8 @@ class FitnessApp extends App {
}
final
List
<
Measurement
>
_userData
=
[
new
Measurement
(
when:
new
DateTime
.
now
(),
weight:
400.0
)
new
Measurement
(
weight:
180.0
,
when:
new
DateTime
.
now
().
add
(
const
Duration
(
days:
-
1
))),
new
Measurement
(
weight:
160.0
,
when:
new
DateTime
.
now
()),
];
Widget
build
()
{
...
...
sky/sdk/example/fitness/lib/measurement.dart
浏览文件 @
3f55a95d
...
...
@@ -2,10 +2,112 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import
'package:sky/editing/input.dart'
;
import
'package:sky/widgets/basic.dart'
;
import
'package:sky/widgets/flat_button.dart'
;
import
'package:sky/widgets/icon_button.dart'
;
import
'package:sky/widgets/ink_well.dart'
;
import
'package:sky/widgets/material.dart'
;
import
'package:sky/widgets/navigator.dart'
;
import
'package:sky/widgets/scaffold.dart'
;
import
'package:sky/widgets/scrollable_viewport.dart'
;
import
'package:sky/widgets/snack_bar.dart'
;
import
'package:sky/widgets/tool_bar.dart'
;
typedef
void
MeasurementHandler
(
Measurement
measurement
);
class
Measurement
{
Measurement
({
this
.
when
,
this
.
weight
});
final
DateTime
when
;
final
double
weight
;
Measurement
({
this
.
when
,
this
.
weight
});
// TODO(jackson): Internationalize
String
get
displayWeight
=>
"
${weight.toStringAsFixed(2)}
lbs"
;
String
get
displayDate
=>
"
${when.year.toString()}
-
${when.month.toString().padLeft(2,'0')}
-
${when.day.toString().padLeft(2,'0')}
"
;
}
class
MeasurementFragment
extends
StatefulComponent
{
MeasurementFragment
({
this
.
navigator
,
this
.
onCreated
});
Navigator
navigator
;
MeasurementHandler
onCreated
;
void
syncFields
(
MeasurementFragment
source
)
{
navigator
=
source
.
navigator
;
onCreated
=
source
.
onCreated
;
}
String
_weight
=
""
;
String
_errorMessage
=
null
;
void
_handleSave
()
{
double
parsedWeight
;
try
{
parsedWeight
=
double
.
parse
(
_weight
);
}
on
FormatException
{
setState
(()
{
_errorMessage
=
"Save failed"
;
});
return
;
}
onCreated
(
new
Measurement
(
when:
new
DateTime
.
now
(),
weight:
parsedWeight
));
navigator
.
pop
();
}
Widget
buildToolBar
()
{
return
new
ToolBar
(
left:
new
IconButton
(
icon:
"navigation/close"
,
onPressed:
navigator
.
pop
),
center:
new
Text
(
'New Measurement'
),
right:
[
new
InkWell
(
child:
new
Listener
(
onGestureTap:
(
_
)
=>
_handleSave
(),
child:
new
Text
(
'SAVE'
)
)
)]
);
}
void
_handleWeightChanged
(
String
weight
)
{
setState
(()
{
_weight
=
weight
;
});
}
Widget
buildMeasurementPane
()
{
Measurement
measurement
=
new
Measurement
(
when:
new
DateTime
.
now
());
return
new
Material
(
type:
MaterialType
.
canvas
,
child:
new
ScrollableViewport
(
child:
new
Container
(
padding:
const
EdgeDims
.
all
(
20.0
),
child:
new
Block
([
new
Text
(
measurement
.
displayDate
),
new
Input
(
focused:
false
,
placeholder:
'Enter weight'
,
onChanged:
_handleWeightChanged
),
])
)
)
);
}
Widget
buildSnackBar
()
{
if
(
_errorMessage
==
null
)
return
null
;
return
new
SnackBar
(
content:
new
Text
(
_errorMessage
));
}
Widget
build
()
{
return
new
Scaffold
(
toolbar:
buildToolBar
(),
body:
buildMeasurementPane
(),
snackBar:
buildSnackBar
()
);
}
}
sky/sdk/lib/widgets/snack_bar.dart
浏览文件 @
3f55a95d
...
...
@@ -53,7 +53,9 @@ class SnackBar extends Component {
)
)
)
]..
addAll
(
actions
);
];
if
(
actions
!=
null
)
children
.
addAll
(
actions
);
return
new
Material
(
level:
2
,
color:
const
Color
(
0xFF323232
),
...
...
sky/sdk/lib/widgets/tool_bar.dart
浏览文件 @
3f55a95d
...
...
@@ -31,12 +31,14 @@ class ToolBar extends Component {
Widget
build
()
{
Color
toolbarColor
=
backgroundColor
;
IconThemeData
iconThemeData
;
TextStyle
defaultTextStyle
=
typography
.
white
.
title
;
TextStyle
centerStyle
=
typography
.
white
.
title
;
TextStyle
sideStyle
=
typography
.
white
.
body1
;
if
(
toolbarColor
==
null
)
{
ThemeData
themeData
=
Theme
.
of
(
this
);
toolbarColor
=
themeData
.
primaryColor
;
if
(
themeData
.
primaryColorBrightness
==
ThemeBrightness
.
light
)
{
defaultTextStyle
=
typography
.
black
.
title
;
centerStyle
=
typography
.
black
.
title
;
sideStyle
=
typography
.
black
.
body2
;
iconThemeData
=
const
IconThemeData
(
color:
IconThemeColor
.
black
);
}
else
{
iconThemeData
=
const
IconThemeData
(
color:
IconThemeColor
.
white
);
...
...
@@ -50,7 +52,7 @@ class ToolBar extends Component {
children
.
add
(
new
Flexible
(
child:
new
Padding
(
child:
center
,
child:
new
DefaultTextStyle
(
child:
center
,
style:
centerStyle
)
,
padding:
new
EdgeDims
.
only
(
left:
24.0
)
)
)
...
...
@@ -61,7 +63,7 @@ class ToolBar extends Component {
Widget
content
=
new
Container
(
child:
new
DefaultTextStyle
(
style:
defaultText
Style
,
style:
side
Style
,
child:
new
Flex
(
[
new
Container
(
child:
new
Flex
(
children
),
height:
kToolBarHeight
)],
alignItems:
FlexAlignItems
.
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录