remove builds from db if pkg is deleted
fix apibuilder interval refreshes refreshing widgets not visible
This commit is contained in:
@ -2,8 +2,9 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:visibility_detector/visibility_detector.dart';
|
||||
|
||||
import 'BaseProvider.dart';
|
||||
import '../../providers/BaseProvider.dart';
|
||||
|
||||
class APIBuilder<T extends BaseProvider, K, DTO> extends StatefulWidget {
|
||||
const APIBuilder(
|
||||
@ -25,6 +26,7 @@ class APIBuilder<T extends BaseProvider, K, DTO> extends StatefulWidget {
|
||||
class _APIBuilderState<T extends BaseProvider, K, DTO>
|
||||
extends State<APIBuilder<T, K, DTO>> {
|
||||
Timer? timer;
|
||||
bool visible = true;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
@ -33,12 +35,10 @@ class _APIBuilderState<T extends BaseProvider, K, DTO>
|
||||
|
||||
if (widget.interval != null) {
|
||||
timer = Timer.periodic(widget.interval!, (Timer t) {
|
||||
final RenderObject? box = context.findRenderObject();
|
||||
print(box);
|
||||
print(context.mounted);
|
||||
|
||||
Provider.of<T>(context, listen: false)
|
||||
.refresh(context, dto: widget.dto);
|
||||
if (visible) {
|
||||
Provider.of<T>(context, listen: false)
|
||||
.refresh(context, dto: widget.dto);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -53,15 +53,30 @@ class _APIBuilderState<T extends BaseProvider, K, DTO>
|
||||
Widget build(BuildContext context) {
|
||||
final Future<K> fut = Provider.of<T>(context).data as Future<K>;
|
||||
|
||||
return FutureBuilder<K>(
|
||||
future: fut,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
return widget.onData(snapshot.data!);
|
||||
} else {
|
||||
return widget.onLoad();
|
||||
return VisibilityDetector(
|
||||
key: widget.key ?? const Key("APIBuilder"),
|
||||
onVisibilityChanged: (visibilityInfo) {
|
||||
var visiblePercentage = visibilityInfo.visibleFraction * 100;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
visible = visiblePercentage != 0;
|
||||
});
|
||||
}
|
||||
|
||||
debugPrint(
|
||||
'Widget ${visibilityInfo.key} is ${visiblePercentage}% visible');
|
||||
},
|
||||
child: FutureBuilder<K>(
|
||||
future: fut,
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData) {
|
||||
return widget.onData(snapshot.data!);
|
||||
} else {
|
||||
return widget.onLoad();
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -4,7 +4,7 @@ import 'package:aurcache/api/builds.dart';
|
||||
import 'package:aurcache/components/builds_table.dart';
|
||||
import 'package:aurcache/models/build.dart';
|
||||
import 'package:aurcache/components/dashboard/your_packages.dart';
|
||||
import 'package:aurcache/providers/APIBuilder.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/builds_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
@ -41,6 +41,7 @@ class _RecentBuildsState extends State<RecentBuilds> {
|
||||
SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<BuildsProvider, List<Build>, BuildsDTO>(
|
||||
key: const Key("Builds on dashboard"),
|
||||
dto: BuildsDTO(limit: 10),
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("no data"),
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:aurcache/api/packages.dart';
|
||||
import 'package:aurcache/providers/APIBuilder.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/packages_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
@ -44,7 +44,7 @@ class _YourPackagesState extends State<YourPackages> {
|
||||
child: SizedBox(
|
||||
width: double.infinity,
|
||||
child: APIBuilder<PackagesProvider, List<Package>, Object>(
|
||||
key: GlobalKey(),
|
||||
key: Key("Packages on dashboard"),
|
||||
interval: const Duration(seconds: 10),
|
||||
onData: (data) {
|
||||
return DataTable(
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../utils/responsive.dart';
|
||||
import '../screens/dashboard_screen.dart';
|
||||
import '../../utils/responsive.dart';
|
||||
import '../../screens/dashboard_screen.dart';
|
||||
import 'side_menu.dart';
|
||||
|
||||
class MenuShell extends StatelessWidget {
|
@ -1,7 +1,7 @@
|
||||
import 'package:aurcache/screens/build_screen.dart';
|
||||
import 'package:aurcache/screens/builds_screen.dart';
|
||||
import 'package:aurcache/screens/dashboard_screen.dart';
|
||||
import 'package:aurcache/components/menu_shell.dart';
|
||||
import 'package:aurcache/components/routing/menu_shell.dart';
|
||||
import 'package:aurcache/screens/package_screen.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import '../constants/color_constants.dart';
|
||||
import '../../constants/color_constants.dart';
|
||||
|
||||
class SideMenu extends StatelessWidget {
|
||||
const SideMenu({
|
||||
@ -86,7 +86,7 @@ class DrawerListTile extends StatelessWidget {
|
||||
),
|
||||
title: Text(
|
||||
title,
|
||||
style: TextStyle(color: Colors.white54),
|
||||
style: const TextStyle(color: Colors.white54),
|
||||
),
|
||||
);
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import 'package:aurcache/components/router.dart';
|
||||
import 'package:aurcache/components/routing/router.dart';
|
||||
import 'package:aurcache/providers/build_provider.dart';
|
||||
import 'package:aurcache/providers/builds_provider.dart';
|
||||
import 'package:aurcache/providers/package_provider.dart';
|
||||
|
@ -3,7 +3,7 @@ import 'dart:async';
|
||||
import 'package:aurcache/api/builds.dart';
|
||||
import 'package:aurcache/components/build_output.dart';
|
||||
import 'package:aurcache/models/build.dart';
|
||||
import 'package:aurcache/providers/APIBuilder.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/build_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'package:aurcache/components/builds_table.dart';
|
||||
import 'package:aurcache/providers/APIBuilder.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/builds_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import '../constants/color_constants.dart';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'package:aurcache/api/statistics.dart';
|
||||
import 'package:aurcache/providers/APIBuilder.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/stats_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
@ -2,10 +2,11 @@ import 'dart:async';
|
||||
|
||||
import 'package:aurcache/api/builds.dart';
|
||||
import 'package:aurcache/api/packages.dart';
|
||||
import 'package:aurcache/providers/APIBuilder.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/builds_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../api/API.dart';
|
||||
import '../components/builds_table.dart';
|
||||
@ -15,6 +16,7 @@ import '../models/build.dart';
|
||||
import '../models/package.dart';
|
||||
import '../providers/package_provider.dart';
|
||||
import '../providers/packages_provider.dart';
|
||||
import '../providers/stats_provider.dart';
|
||||
|
||||
class PackageScreen extends StatefulWidget {
|
||||
const PackageScreen({super.key, required this.pkgID});
|
||||
@ -61,6 +63,15 @@ class _PackageScreenState extends State<PackageScreen> {
|
||||
final succ = await API.deletePackage(pkg.id);
|
||||
if (succ) {
|
||||
context.pop();
|
||||
|
||||
Provider.of<PackagesProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
Provider.of<BuildsProvider>(context,
|
||||
listen: false)
|
||||
.refresh(context);
|
||||
Provider.of<StatsProvider>(context, listen: false)
|
||||
.refresh(context);
|
||||
}
|
||||
},
|
||||
child: const Text(
|
||||
@ -92,7 +103,7 @@ class _PackageScreenState extends State<PackageScreen> {
|
||||
width: double.infinity,
|
||||
child: APIBuilder<BuildsProvider, List<Build>,
|
||||
BuildsDTO>(
|
||||
key: GlobalKey(),
|
||||
key: const Key("Builds on Package info"),
|
||||
dto: BuildsDTO(pkgID: pkg.id),
|
||||
interval: const Duration(seconds: 5),
|
||||
onData: (data) {
|
||||
|
Reference in New Issue
Block a user