mirror of https://github.com/flutter/samples.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.8 KiB
100 lines
3.8 KiB
3 months ago
|
// Copyright 2024 The Flutter 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:flutter/cupertino.dart';
|
||
|
import 'package:provider/provider.dart';
|
||
|
|
||
|
import 'event.dart';
|
||
|
import 'event_data.dart';
|
||
|
import 'event_editor.dart';
|
||
|
import 'event_row.dart';
|
||
|
|
||
|
class EventList extends StatelessWidget {
|
||
|
const EventList({super.key});
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return Consumer<EventData>(
|
||
|
builder: (BuildContext context, EventData events, Widget? child) {
|
||
|
return CupertinoPageScaffold(
|
||
|
// TODO(mit-mit): Avoid having to pass nav bar manually.
|
||
|
//
|
||
|
// Would like to pass nav bar and body to CupertinoPageScaffold
|
||
|
// directly, similar to the Material Scaffold's `appBar` and `body`
|
||
|
// args.
|
||
|
// https://github.com/flutter/flutter/issues/149625
|
||
|
child: CustomScrollView(
|
||
|
slivers: <Widget>[
|
||
|
CupertinoSliverNavigationBar(
|
||
|
largeTitle: const Text('Date Planner'),
|
||
|
trailing: CupertinoButton(
|
||
|
padding: EdgeInsets.zero,
|
||
|
child: const Icon(CupertinoIcons.plus),
|
||
|
onPressed: () async {
|
||
|
// Issue: Should go to a sheet, not a a full-screen page.
|
||
|
// Blocked on https://github.com/flutter/flutter/issues/42560.
|
||
|
Event? newEvent = await Navigator.of(context).push(
|
||
|
CupertinoPageRoute<Event>(
|
||
|
builder: (_) => EventEditor(
|
||
|
event: Event(title: 'New event'),
|
||
|
isNew: true,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
if (newEvent != null) {
|
||
|
events.add(newEvent);
|
||
|
}
|
||
|
},
|
||
|
),
|
||
|
),
|
||
|
SliverList.list(
|
||
|
children: [
|
||
|
for (Period p in Period.values)
|
||
|
CupertinoListSection(
|
||
|
header: Text(
|
||
|
p.name.toUpperCase(),
|
||
|
style: const TextStyle(
|
||
|
fontWeight: FontWeight.bold,
|
||
|
fontSize: 16,
|
||
|
),
|
||
|
),
|
||
|
children: [
|
||
|
for (Event e in events.sorted(p))
|
||
|
// TODO: Support swipe action for deleting.
|
||
|
// Should probably use Dismissable?
|
||
|
// https://api.flutter.dev/flutter/widgets/Dismissible-class.html
|
||
|
EventRow(
|
||
|
event: e,
|
||
|
onTap: () async {
|
||
|
Event? updatedEvent =
|
||
|
await Navigator.of(context).push(
|
||
|
CupertinoPageRoute<Event>(
|
||
|
builder: (_) => EventEditor(
|
||
|
event: e.copy(),
|
||
|
isNew: false,
|
||
|
),
|
||
|
),
|
||
|
);
|
||
|
if (updatedEvent == null) {
|
||
|
// The editor passes back null when it deleted
|
||
|
// the element.
|
||
|
events.delete(e);
|
||
|
} else {
|
||
|
events.update(e, updatedEvent);
|
||
|
}
|
||
|
},
|
||
|
)
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
},
|
||
|
);
|
||
|
}
|
||
|
}
|