add buildlogprovider to handle scrolling from outside widget
This commit is contained in:
		@@ -3,7 +3,7 @@ import 'dart:async';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:provider/provider.dart';
 | 
			
		||||
 | 
			
		||||
import '../../providers/BaseProvider.dart';
 | 
			
		||||
import '../../providers/api/BaseProvider.dart';
 | 
			
		||||
 | 
			
		||||
class APIBuilder<T extends BaseProvider, K, DTO> extends StatefulWidget {
 | 
			
		||||
  const APIBuilder(
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,11 @@ import 'dart:async';
 | 
			
		||||
 | 
			
		||||
import 'package:aurcache/api/builds.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:provider/provider.dart';
 | 
			
		||||
 | 
			
		||||
import '../api/API.dart';
 | 
			
		||||
import '../models/build.dart';
 | 
			
		||||
import '../providers/build_log_provider.dart';
 | 
			
		||||
 | 
			
		||||
class BuildOutput extends StatefulWidget {
 | 
			
		||||
  const BuildOutput({super.key, required this.build});
 | 
			
		||||
@@ -20,14 +22,15 @@ class _BuildOutputState extends State<BuildOutput> {
 | 
			
		||||
 | 
			
		||||
  String output = "";
 | 
			
		||||
  Timer? outputTimer;
 | 
			
		||||
  final scrollController = ScrollController();
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    final sc =
 | 
			
		||||
        Provider.of<BuildLogProvider>(context, listen: false).scrollController;
 | 
			
		||||
    return Expanded(
 | 
			
		||||
      flex: 1,
 | 
			
		||||
      child: SingleChildScrollView(
 | 
			
		||||
        controller: scrollController,
 | 
			
		||||
        controller: sc,
 | 
			
		||||
        scrollDirection: Axis.vertical, //.horizontal
 | 
			
		||||
        child: Padding(
 | 
			
		||||
          padding: const EdgeInsets.only(left: 30, right: 15),
 | 
			
		||||
@@ -57,38 +60,28 @@ class _BuildOutputState extends State<BuildOutput> {
 | 
			
		||||
      setState(() {
 | 
			
		||||
        output = value;
 | 
			
		||||
      });
 | 
			
		||||
      _scrollToBottom();
 | 
			
		||||
      Provider.of<BuildLogProvider>(context, listen: false).go_to_bottom();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // poll new output only if not finished
 | 
			
		||||
    if (widget.build.status == 0) {
 | 
			
		||||
      outputTimer = Timer.periodic(const Duration(seconds: 3), (Timer t) async {
 | 
			
		||||
        print("refreshing output");
 | 
			
		||||
        final value = await API.getOutput(
 | 
			
		||||
            buildID: widget.build.id, line: output.split("\n").length);
 | 
			
		||||
        setState(() {
 | 
			
		||||
          output += value;
 | 
			
		||||
        });
 | 
			
		||||
        final follow =
 | 
			
		||||
            Provider.of<BuildLogProvider>(context, listen: false).followLog;
 | 
			
		||||
        if (follow) {
 | 
			
		||||
          print("refreshing output");
 | 
			
		||||
          final value = await API.getOutput(
 | 
			
		||||
              buildID: widget.build.id, line: output.split("\n").length);
 | 
			
		||||
          setState(() {
 | 
			
		||||
            output += value;
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
        _scrollToBottom();
 | 
			
		||||
          Provider.of<BuildLogProvider>(context, listen: false).go_to_bottom();
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void _scrollToBottom() {
 | 
			
		||||
    WidgetsBinding.instance.addPostFrameCallback((_) {
 | 
			
		||||
      // scroll to bottom
 | 
			
		||||
      final scrollPosition = scrollController.position;
 | 
			
		||||
      if (scrollPosition.viewportDimension < scrollPosition.maxScrollExtent) {
 | 
			
		||||
        scrollController.animateTo(
 | 
			
		||||
          scrollPosition.maxScrollExtent,
 | 
			
		||||
          duration: const Duration(milliseconds: 200),
 | 
			
		||||
          curve: Curves.easeOut,
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void dispose() {
 | 
			
		||||
    super.dispose();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
import 'package:aurcache/components/builds_table.dart';
 | 
			
		||||
import 'package:aurcache/models/build.dart';
 | 
			
		||||
import 'package:aurcache/components/api/APIBuilder.dart';
 | 
			
		||||
import 'package:aurcache/providers/builds_provider.dart';
 | 
			
		||||
import 'package:aurcache/providers/api/builds_provider.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:go_router/go_router.dart';
 | 
			
		||||
import '../../constants/color_constants.dart';
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
import 'package:aurcache/components/api/APIBuilder.dart';
 | 
			
		||||
import 'package:aurcache/components/packages_table.dart';
 | 
			
		||||
import 'package:aurcache/providers/packages_provider.dart';
 | 
			
		||||
import 'package:aurcache/providers/api/packages_provider.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:go_router/go_router.dart';
 | 
			
		||||
import '../../constants/color_constants.dart';
 | 
			
		||||
 
 | 
			
		||||
@@ -6,9 +6,9 @@ import 'package:provider/provider.dart';
 | 
			
		||||
import '../api/API.dart';
 | 
			
		||||
import '../constants/color_constants.dart';
 | 
			
		||||
import '../models/package.dart';
 | 
			
		||||
import '../providers/builds_provider.dart';
 | 
			
		||||
import '../providers/packages_provider.dart';
 | 
			
		||||
import '../providers/stats_provider.dart';
 | 
			
		||||
import '../providers/api/builds_provider.dart';
 | 
			
		||||
import '../providers/api/packages_provider.dart';
 | 
			
		||||
import '../providers/api/stats_provider.dart';
 | 
			
		||||
import 'confirm_popup.dart';
 | 
			
		||||
import 'dashboard/your_packages.dart';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user