Shows username on listtile
This commit is contained in:
@@ -2,6 +2,7 @@ import 'package:briessenchecker/pages/detail_checklist_page.dart';
|
||||
import 'package:briessenchecker/pages/edit_checklist_page.dart';
|
||||
import 'package:briessenchecker/services/checklist_provider.dart';
|
||||
import 'package:briessenchecker/services/dbhelper.dart';
|
||||
import 'package:briessenchecker/services/profile_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
@@ -16,6 +17,9 @@ void main() async {
|
||||
ChangeNotifierProvider(
|
||||
create: (_) => ChecklistProvider(),
|
||||
),
|
||||
ChangeNotifierProvider(
|
||||
create: (_) => ProfileProvider(),
|
||||
),
|
||||
StreamProvider.value(
|
||||
value: DbHelper.checklistChangeEventStream,
|
||||
initialData: null,
|
||||
@@ -38,8 +42,9 @@ class MyApp extends StatelessWidget {
|
||||
theme: ThemeData.dark(
|
||||
useMaterial3: true,
|
||||
).copyWith(
|
||||
dividerTheme: const DividerThemeData(thickness: 1),
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: const Color.fromARGB(255, 0, 141, 42),
|
||||
seedColor: const Color.fromARGB(255, 17, 212, 75),
|
||||
),
|
||||
),
|
||||
initialRoute: '/',
|
||||
|
||||
12
lib/models/profile.dart
Normal file
12
lib/models/profile.dart
Normal file
@@ -0,0 +1,12 @@
|
||||
class Profile {
|
||||
final String id;
|
||||
final String username;
|
||||
final String language;
|
||||
final String bio;
|
||||
|
||||
Profile(
|
||||
{required this.id,
|
||||
this.username = '',
|
||||
this.language = '',
|
||||
this.bio = ''});
|
||||
}
|
||||
@@ -106,7 +106,7 @@ class _DashboardPageState extends State<DashboardPage> {
|
||||
clChangeStream.listen(_onClChanged);
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('Brießenchecker9000'),
|
||||
title: const Text('Brisenchecker9000'),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () => DbHelper.logout(),
|
||||
|
||||
@@ -76,7 +76,7 @@ class _DetailChecklistPageState extends State<DetailChecklistPage> {
|
||||
} else if (snapshot.hasError) {
|
||||
return Text('Ooooops, ${snapshot.error}');
|
||||
} else {
|
||||
return const CircularProgressIndicator();
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,6 +110,7 @@ class _DetailChecklistPageState extends State<DetailChecklistPage> {
|
||||
isChecked: _checkedItemIds.contains(item.id),
|
||||
onCheckedChanged: (isChecked) =>
|
||||
_onItemCheckedChanged(isChecked, item.id),
|
||||
ownerId: item.ownerId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -179,9 +180,16 @@ class _DetailChecklistPageState extends State<DetailChecklistPage> {
|
||||
if (snapshot.hasData) {
|
||||
_items = DbHelper.resToItemList(snapshot.data!);
|
||||
}
|
||||
return ListView.builder(
|
||||
return ListView.separated(
|
||||
itemCount: _items.length,
|
||||
itemBuilder: _itemListBuilder,
|
||||
separatorBuilder: (context, index) {
|
||||
return const Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 15.0),
|
||||
child: Divider(),
|
||||
));
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import 'package:briessenchecker/pages/dashboard_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart' as p;
|
||||
import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
|
||||
import '../services/dbhelper.dart';
|
||||
import '../services/profile_provider.dart';
|
||||
import 'login_page.dart';
|
||||
|
||||
class LandingPage extends StatefulWidget {
|
||||
@@ -27,8 +29,11 @@ class _LandingPageState extends State<LandingPage> {
|
||||
return const LoginPage();
|
||||
}
|
||||
|
||||
void _onAuthEvent(AuthState event) {
|
||||
void _onAuthEvent(AuthState event) async {
|
||||
if (event.event == AuthChangeEvent.signedIn) {
|
||||
await DbHelper.fetchProfiles().then((value) =>
|
||||
p.Provider.of<ProfileProvider>(context, listen: false)
|
||||
.updateProfiles(value));
|
||||
setState(() => _isLoggedIn = true);
|
||||
} else if (event.event == AuthChangeEvent.signedOut) {
|
||||
setState(() => _isLoggedIn = false);
|
||||
|
||||
@@ -9,6 +9,8 @@ import '../models/checklist.dart';
|
||||
import '../models/listitem.dart';
|
||||
import 'package:provider/provider.dart' as provider;
|
||||
|
||||
import '../models/profile.dart';
|
||||
|
||||
class DbHelper {
|
||||
static const checkedItemsTableName = 'checkedItems';
|
||||
static const checklistsTableName = 'checklists';
|
||||
@@ -76,6 +78,22 @@ class DbHelper {
|
||||
return itemIdList;
|
||||
}
|
||||
|
||||
static Future<List<Profile>> fetchProfiles() async {
|
||||
List<Profile> profiles = [];
|
||||
final res = await _client
|
||||
.from(profilesTableName)
|
||||
.select<List<Map<String, dynamic>>>();
|
||||
for (final element in res) {
|
||||
profiles.add(Profile(
|
||||
id: element['id'],
|
||||
username: element['username'],
|
||||
language: element['language'] ?? '',
|
||||
bio: element['bio'] ?? '',
|
||||
));
|
||||
}
|
||||
return profiles;
|
||||
}
|
||||
|
||||
static Future<void> insertCheckedEntry(int checklistId, int itemId) async {
|
||||
final ownerId = _client.auth.currentSession!.user.id;
|
||||
await _client.from(checkedItemsTableName).insert({
|
||||
|
||||
18
lib/services/profile_provider.dart
Normal file
18
lib/services/profile_provider.dart
Normal file
@@ -0,0 +1,18 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../models/profile.dart';
|
||||
|
||||
class ProfileProvider extends ChangeNotifier {
|
||||
List<Profile> _profiles = [];
|
||||
|
||||
void updateProfiles(List<Profile> profiles, {bool silent = false}) {
|
||||
_profiles = profiles;
|
||||
if (!silent) notifyListeners();
|
||||
}
|
||||
|
||||
Profile? getProfileById(String id) {
|
||||
if (_profiles.isEmpty) return null;
|
||||
final profile = _profiles.where((element) => element.id == id).first;
|
||||
return profile;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,8 @@
|
||||
import 'package:briessenchecker/services/dbhelper.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../services/profile_provider.dart';
|
||||
|
||||
typedef BoolCallback = void Function(bool isSelected);
|
||||
|
||||
@@ -12,6 +16,7 @@ class ItemListTile extends StatefulWidget {
|
||||
required this.selectionMode,
|
||||
required this.isChecked,
|
||||
required this.onCheckedChanged,
|
||||
this.ownerId = '',
|
||||
});
|
||||
final String title;
|
||||
final String description;
|
||||
@@ -20,6 +25,7 @@ class ItemListTile extends StatefulWidget {
|
||||
final VoidCallback onTap;
|
||||
final BoolCallback onCheckedChanged;
|
||||
final BoolCallback itemSelectionChanged;
|
||||
final String ownerId;
|
||||
|
||||
@override
|
||||
State<ItemListTile> createState() => _ItemListTileState();
|
||||
@@ -28,10 +34,12 @@ class ItemListTile extends StatefulWidget {
|
||||
class _ItemListTileState extends State<ItemListTile> {
|
||||
late bool isChecked;
|
||||
bool isSelected = false;
|
||||
late ProfileProvider profileProvider;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
profileProvider = Provider.of<ProfileProvider>(context, listen: false);
|
||||
isChecked = widget.isChecked;
|
||||
}
|
||||
|
||||
@@ -39,7 +47,16 @@ class _ItemListTileState extends State<ItemListTile> {
|
||||
Widget build(BuildContext context) {
|
||||
return ListTile(
|
||||
title: Text(widget.title),
|
||||
subtitle: Text(widget.description),
|
||||
subtitle: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(widget.description),
|
||||
Text(
|
||||
profileProvider.getProfileById(widget.ownerId)?.username ?? '',
|
||||
style: const TextStyle(color: Colors.grey),
|
||||
)
|
||||
],
|
||||
),
|
||||
onTap: _onTap,
|
||||
onLongPress: _onLongPress,
|
||||
selected: isSelected,
|
||||
|
||||
Reference in New Issue
Block a user