mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

Anywhere that accepted IconData now accepts either an Icon or an ImageIcon. Places that used to take an IconData in an `icon` argument, notably IconButton and DrawerItem, now take a Widget in that slot. You can wrap the value that used to be passed in in an Icon constructor to get the same result. Icon itself now takes the icon as a positional argument, for brevity. ThemeData now has an iconTheme as well as a primaryIconTheme, the same way it has had a textTheme and primaryTextTheme for a while. IconTheme.of() always returns a value now (though that value itself may have nulls in it). It defaults to the ThemeData.iconTheme. IconThemeData.fallback() is a new method that returns an icon theme data structure with all fields filled in. IconTheme.merge() is a new constructor that takes a context and creates a widget that mixes in the new values with the inherited values. Most places that introduced an IconTheme widget now use IconTheme.merge. IconThemeData.merge and IconThemeData.copyWith act in a way analogous to the similarly-named members of TextStyle. ImageIcon is introduced. It acts like Icon but takes an ImageProvider instead of an IconData. Also: Fix the analyzer to actually check the stocks app.
168 lines
5.3 KiB
Dart
168 lines
5.3 KiB
Dart
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'package:collection/collection.dart' show lowerBound;
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
enum LeaveBehindDemoAction {
|
|
reset,
|
|
horizontalSwipe,
|
|
leftSwipe,
|
|
rightSwipe
|
|
}
|
|
|
|
class LeaveBehindItem implements Comparable<LeaveBehindItem> {
|
|
LeaveBehindItem({ this.index, this.name, this.subject, this.body });
|
|
|
|
LeaveBehindItem.from(LeaveBehindItem item)
|
|
: index = item.index, name = item.name, subject = item.subject, body = item.body;
|
|
|
|
final int index;
|
|
final String name;
|
|
final String subject;
|
|
final String body;
|
|
|
|
@override
|
|
int compareTo(LeaveBehindItem other) => index.compareTo(other.index);
|
|
}
|
|
|
|
class LeaveBehindDemo extends StatefulWidget {
|
|
LeaveBehindDemo({ Key key }) : super(key: key);
|
|
|
|
static const String routeName = '/leave-behind';
|
|
|
|
@override
|
|
LeaveBehindDemoState createState() => new LeaveBehindDemoState();
|
|
}
|
|
|
|
class LeaveBehindDemoState extends State<LeaveBehindDemo> {
|
|
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
|
|
DismissDirection _dismissDirection = DismissDirection.horizontal;
|
|
List<LeaveBehindItem> leaveBehindItems;
|
|
|
|
void initListItems() {
|
|
leaveBehindItems = new List<LeaveBehindItem>.generate(16, (int index) {
|
|
return new LeaveBehindItem(
|
|
index: index,
|
|
name: 'Item $index Sender',
|
|
subject: 'Subject: $index',
|
|
body: "[$index] first line of the message's body..."
|
|
);
|
|
});
|
|
}
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
initListItems();
|
|
}
|
|
|
|
void handleDemoAction(LeaveBehindDemoAction action) {
|
|
switch(action) {
|
|
case LeaveBehindDemoAction.reset:
|
|
initListItems();
|
|
break;
|
|
case LeaveBehindDemoAction.horizontalSwipe:
|
|
_dismissDirection = DismissDirection.horizontal;
|
|
break;
|
|
case LeaveBehindDemoAction.leftSwipe:
|
|
_dismissDirection = DismissDirection.endToStart;
|
|
break;
|
|
case LeaveBehindDemoAction.rightSwipe:
|
|
_dismissDirection = DismissDirection.startToEnd;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void handleUndo(LeaveBehindItem item) {
|
|
int insertionIndex = lowerBound(leaveBehindItems, item);
|
|
setState(() {
|
|
leaveBehindItems.insert(insertionIndex, item);
|
|
});
|
|
}
|
|
|
|
Widget buildItem(LeaveBehindItem item) {
|
|
final ThemeData theme = Theme.of(context);
|
|
return new Dismissable(
|
|
key: new ObjectKey(item),
|
|
direction: _dismissDirection,
|
|
onDismissed: (DismissDirection direction) {
|
|
setState(() {
|
|
leaveBehindItems.remove(item);
|
|
});
|
|
final String action = (direction == DismissDirection.endToStart) ? 'archived' : 'deleted';
|
|
_scaffoldKey.currentState.showSnackBar(new SnackBar(
|
|
content: new Text('You $action item ${item.index}'),
|
|
action: new SnackBarAction(
|
|
label: 'UNDO',
|
|
onPressed: () { handleUndo(item); }
|
|
)
|
|
));
|
|
},
|
|
background: new Container(
|
|
decoration: new BoxDecoration(backgroundColor: theme.primaryColor),
|
|
child: new ListItem(
|
|
leading: new Icon(Icons.delete, color: Colors.white, size: 36.0)
|
|
)
|
|
),
|
|
secondaryBackground: new Container(
|
|
decoration: new BoxDecoration(backgroundColor: theme.primaryColor),
|
|
child: new ListItem(
|
|
trailing: new Icon(Icons.archive, color: Colors.white, size: 36.0)
|
|
)
|
|
),
|
|
child: new Container(
|
|
decoration: new BoxDecoration(
|
|
backgroundColor: theme.canvasColor,
|
|
border: new Border(bottom: new BorderSide(color: theme.dividerColor))
|
|
),
|
|
child: new ListItem(
|
|
title: new Text(item.name),
|
|
subtitle: new Text('${item.subject}\n${item.body}'),
|
|
isThreeLine: true
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return new Scaffold(
|
|
key: _scaffoldKey,
|
|
appBar: new AppBar(
|
|
title: new Text('Swipe items to dismiss'),
|
|
actions: <Widget>[
|
|
new PopupMenuButton<LeaveBehindDemoAction>(
|
|
onSelected: handleDemoAction,
|
|
itemBuilder: (BuildContext context) => <PopupMenuEntry<LeaveBehindDemoAction>>[
|
|
new PopupMenuItem<LeaveBehindDemoAction>(
|
|
value: LeaveBehindDemoAction.reset,
|
|
child: new Text('Reset the list')
|
|
),
|
|
new PopupMenuDivider(),
|
|
new CheckedPopupMenuItem<LeaveBehindDemoAction>(
|
|
value: LeaveBehindDemoAction.horizontalSwipe,
|
|
checked: _dismissDirection == DismissDirection.horizontal,
|
|
child: new Text('Hoizontal swipe')
|
|
),
|
|
new CheckedPopupMenuItem<LeaveBehindDemoAction>(
|
|
value: LeaveBehindDemoAction.leftSwipe,
|
|
checked: _dismissDirection == DismissDirection.endToStart,
|
|
child: new Text('Only swipe left')
|
|
),
|
|
new CheckedPopupMenuItem<LeaveBehindDemoAction>(
|
|
value: LeaveBehindDemoAction.rightSwipe,
|
|
checked: _dismissDirection == DismissDirection.startToEnd,
|
|
child: new Text('Only swipe right')
|
|
)
|
|
]
|
|
)
|
|
]
|
|
),
|
|
body: new Block(children: leaveBehindItems.map(buildItem).toList())
|
|
);
|
|
}
|
|
}
|