Published 2025-09-04
Base framework for a simple single-page tool runner.


Consists of a form widget (parametersForm), that manages a data model (parametersProvider).
The actual processor is a static/toplevel callback function (workerCallback), that receives a single parameter structure created by a callback (workerParametersCallback) that converts the form-data to a pure data model without any widget (incl. ChangeNotifier).
This simple framework handles for you:
l10n)Does not work on web.
import 'package:pkg_core/pkg_core.dart';
import 'package:pkg_simple_runner/pkg_simple_runner.dart';
import 'build_version.dart';
import 'src/callbacks/my_worker_callback.dart';
import 'src/callbacks/my_worker_parameters_callback.dart';
import 'src/constants/constants.dart';
import 'src/l10n/example_text.dart';
import 'src/providers/my_form_parameters_provider.dart';
import 'src/widgets/my_form.dart';
void main() {
simpleRunner<MyFormParametersProvider>(
applicationTitle: kApplicationTitle,
buildVersion: const HHBuildVersion(
package: BuildVersion.package,
version: BuildVersion.version,
revision: BuildVersion.revision,
semver: BuildVersion.semver,
),
localizationsDelegates: [
ExampleText.delegate,
],
localServices: <LocalService>[
LocalService.sqlQuery,
],
parametersProvider: MyFormParametersProvider(),
parametersForm: const MyForm(),
workerParametersCallback: myWorkerParametersCallback,
workerCallback: myWorkerCallback,
);
}
See comments in the example code for explanations.

hh new flutter_my_shiny_application from pkg_simple_runner/example
createdEtiketten, deleteEtiketten translations.get_it dependency.providers parameter.Brew upgrade request message on startup when approprivate.HHScaffold and HHAppBar.footerWidgetsBuilder.withWorkerQueue option to allow worker queueing.SendPortExtension::sendProgressMessage.aborting flag when processing again after stopping._WorkerRunnerController crash after choosing language._SimpleRunnerPageModel crash when choosing a language.async constructs.HHLoggerFilterCallback.await unawaited futures.unawaited.FormClearEvent.EventBus and HHLocaleModel are already registered in GetIt.applicationWrapperBuilder parameter to allow wrapping the entire application in another widget.headerWidgetsBuilder parameter to allow insertion of extra header widgets.provider dependency.FormParametersProvider::_readFromGuiJson resolves &amp;amp;lt;username&amp;amp;gt; tag back to a real username.ExceptionEvent for eventbus handling.toJson and fromJson to WorkerParameters (you should overload these).read/write settings from a gui file.gui files to and from &amp;amp;amp;amp;amp;lt;username&amp;amp;amp;amp;amp;gt; tags to prevent machine-specific settings.EventBus with GetIt and supply as Provider.forwardTo to allow a next page after the worker_runner.sendPort earlier after clicking Process... so any exceptions before the isolate can be logged.SendPortExtension::sendException now prints a stacktrace (if present).SqlQueryService.widget-view-controller structure.errorDifferentMediaBoxes to warningDifferentMediaBoxes.FormInfoEvent and handling to send info to the log (mainly outside of the Isolate, in the parameters validator for example).sendLink to send_port_extension.process/my_worker.dart, which is now testable.worker_runner.MyFormIsValidProvider.workerParametersCallback.FormErrorEvent.ClearEvent to clear the log.colorsInit() to main.cached, cachedFile and errorFileNotFound.finals due to new linter rules.localServices parameter and handling of missing services.l10n strings.SendPort::sendBreadCrumb.simpleRunner is now generic simpleRunner&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;T extends FormParametersProvider&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; so we can get our ChangeNotifierProvider to properly work (provider cannot use models that inherit another model).SendPortExtension.WorkerProgress, it was the same as ProgressEvent.HHLogInfo messages from isolate.