createScreen static method
AFGeneratedFile
createScreen(
- AFCommandContext context,
- String uiName,
- AFCommandArgumentsParsed args, {
- AFSourceTemplate? buildWithSPI,
- AFSourceTemplate? buildBody,
- AFSourceTemplate? spiImpls,
- AFSourceTemplate? screenImpls,
- AFSourceTemplate? routeParamImpls,
- AFSourceTemplate? createPrototype,
Implementation
static AFGeneratedFile createScreen(AFCommandContext context, String uiName, AFCommandArgumentsParsed args, {
AFSourceTemplate? buildWithSPI,
AFSourceTemplate? buildBody,
AFSourceTemplate? spiImpls,
AFSourceTemplate? screenImpls,
AFSourceTemplate? routeParamImpls,
AFSourceTemplate? navigatePush,
AFSourceTemplate? createPrototype,
}) {
final controlSettings = findControlKind(uiName);
if(controlSettings == null) {
throw AFCommandError(error: "$uiName must end with one of $controlKinds");
}
final ns = AFibD.config.appNamespace.toUpperCase();
final generator = context.generator;
final minLength = ns.length + controlSettings.suffix.length;
if(uiName.length <= minLength) {
throw AFCommandError(error: "$uiName is too short. It maybe the name of an existing default class. Please differentiate it.");
}
var memberVariables = context.memberVariables(context, args, "${uiName}RouteParam");
final screenIdType = "$ns${controlSettings.suffix}ID";
final spiParentType = "$ns${controlSettings.suffix}SPI";
// create a screen name
final projectPath = generator.pathUI(uiName, controlSettings);
final stateView = args.accessNamed(argStateView);
final stateViewPrefix = generator.removeSuffix(stateView, "StateView");
final screenId = generator.declareUIID(context, uiName, controlSettings);
final screenInsertions = context.coreInsertions.reviseAugment({
ScreenT.insertScreenID: screenId,
ScreenT.insertScreenIDType: screenIdType,
ScreenT.insertControlTypeSuffix: controlSettings.suffix,
AFSourceTemplate.insertMainTypeInsertion: uiName,
ScreenT.insertStateViewType: stateView,
ScreenT.insertStateViewPrefix: stateViewPrefix,
});
Object standardReviseMethods = AFSourceTemplate.empty;
if(memberVariables != null && !args.accessNamedFlag(AFGenerateStateSubcommand.argNoReviseMethods)) {
standardReviseMethods = memberVariables.reviseMethods;
}
final routeParamTemplate = routeParamImpls ?? controlSettings.routeParamImpls;
final routeParamSnippet = context.createSnippet(routeParamTemplate, extend: screenInsertions, insertions: {
AFSourceTemplate.insertMemberVariablesInsertion: memberVariables?.declareVariables ?? AFSourceTemplate.empty,
AFSourceTemplate.insertConstructorParamsInsertion: memberVariables?.constructorParams ?? AFSourceTemplate.empty,
AFSourceTemplate.insertCopyWithParamsInsertion: memberVariables?.copyWithParams ?? AFSourceTemplate.empty,
AFSourceTemplate.insertCopyWithCallInsertion: memberVariables?.copyWithCall ?? AFSourceTemplate.empty,
AFSourceTemplate.insertMemberVariableImportsInsertion: memberVariables?.extraImports(context) ?? AFSourceTemplate.empty,
ModelT.insertReviseMethods: standardReviseMethods,
ModelT.insertResolveMethods: memberVariables?.resolveMethods ?? AFSourceTemplate.empty,
AFSourceTemplate.insertCreateParamsInsertion: memberVariables?.routeParamCreateParams ?? AFSourceTemplate.empty,
AFSourceTemplate.insertCreateParamsCallInsertion: memberVariables?.routeParamCreateCall ?? AFSourceTemplate.empty,
AFSourceTemplate.insertSuperParamsInsertion: memberVariables?.routeParamSuperParams ?? AFSourceTemplate.empty,
SnippetStandardRouteParamT.insertWithFlutterStateSuffix: (memberVariables?.withFlutterState ?? false) ? "WithFlutterState" : "",
});
final navigatePushTemplate = (navigatePush ?? controlSettings.navigatePush);
final navigatePushSnippet = context.createSnippet(navigatePushTemplate, extend: screenInsertions, insertions: {
SnippetNavigatePushT.insertNavigatePushParamDecl: memberVariables?.navigatePushParams ?? AFSourceTemplate.empty,
SnippetNavigatePushT.insertNavigatePushParamCall: memberVariables?.navigatePushCall ?? AFSourceTemplate.empty,
});
final spiSnippet = context.createSnippet(controlSettings.spi, extend: screenInsertions, insertions: {
AFSourceTemplate.insertMainParentTypeInsertion: spiParentType,
SnippetDeclareSPIT.insertSPIOnUpdateMethods: memberVariables?.spiOnUpdateMethods ?? AFSourceTemplate.empty,
SnippetDeclareSPIT.insertSPIResolveMethods: memberVariables?.spiResolveMethods ?? AFSourceTemplate.empty,
AFSourceTemplate.insertStandardAdditionalMethodsInsertion: controlSettings.implsSPI,
});
final superSnippet = context.createSnippet(controlSettings.implsSuper, extend: screenInsertions);
final templateBody = buildBody ?? controlSettings.implBuildBody;
final bodySnippet = context.createSnippet(templateBody, extend: screenInsertions);
var buildWithSPITemplate = buildWithSPI ?? controlSettings.implBuildWithSPI;
final noBackButton = args.accessNamedFlag(argNoBackButton);
if(noBackButton) {
buildWithSPITemplate = SnippetScreenBuildWithSPIImplT.coreNoBackButton();
}
final buildWithSPISnippet = context.createSnippet(buildWithSPITemplate, extend: screenInsertions);
final screenImplsSnippet = context.createSnippet(screenImpls ?? controlSettings.screenAdditionalMethods, extend: screenInsertions);
final extraImports = context.createSnippet(SnippetExtraImportsT.core(), extend: screenInsertions);
final extraImportsRouteParam = memberVariables?.extraImports(context);
if(extraImportsRouteParam != null) {
extraImports.addLinesAtEnd(context, [extraImportsRouteParam]);
}
final paramsConstructorSnippet = context.createSnippet(controlSettings.paramsConstructor, extend: screenInsertions);
final uiMemberVariablesSnippet = context.createSnippet(SnippetScreenMemberVariableDeclsT.core(), extend: screenInsertions);
final extraConfig = context.createSnippet(controlSettings.extraConfigParams, extend: screenInsertions, insertions: {
SnippetCreateScreenPrototypeT.insertNavigatePushParams: memberVariables?.initialValueDeclaration ?? AFSourceTemplate.empty,
});
final screenFile = context.createFile(projectPath, ScreenT(), extend: screenInsertions, insertions: {
AFSourceTemplate.insertExtraImportsInsertion: extraImports,
ScreenT.insertControlTypeSuffix: controlSettings.suffix,
ScreenT.insertDeclareRouteParam: routeParamSnippet,
ScreenT.insertDeclareSPI: spiSnippet,
ScreenT.insertNavigateMethods: navigatePushSnippet,
ScreenT.insertBuildBodyImpl: bodySnippet,
ScreenT.insertBuildWithSPIImpl: buildWithSPISnippet,
ScreenT.insertExtraConfigParams: extraConfig,
AFSourceTemplate.insertSuperParamsInsertion: superSnippet,
AFSourceTemplate.insertAdditionalMethodsInsertion: screenImplsSnippet,
AFSourceTemplate.insertConstructorParamsInsertion: paramsConstructorSnippet,
AFSourceTemplate.insertMemberVariablesInsertion: uiMemberVariablesSnippet,
});
screenFile.importProjectPath(context, generator.pathConnectedBaseFile);
final pathStateView = generator.pathStateView(stateView);
if(pathStateView != null) {
screenFile.importProjectPath(context, pathStateView);
}
/*
final pathTheme = generator.pathTheme(theme, isCustomParent: false);
if(pathTheme != null) {
screenFile.importProjectPath(context, pathTheme);
}
*/
// put the screen in the screen map
if(controlSettings.kind != AFUIControlKind.widget) {
final declareScreenInMap = context.createSnippet(SnippetDefineScreenMapEntryT(), extend: screenInsertions);
final screenMapPath = generator.pathDefineCore;
final screenMapFile = generator.modifyFile(context, screenMapPath);
screenMapFile.addLinesAfter(context, AFCodeRegExp.startScreenMap, declareScreenInMap.lines);
screenMapFile.importFile(context, screenFile);
}
// create a state test shortcut declaration function.
final createShortcut = controlSettings.stateTestShortcut as AFSourceTemplate;
final shortcut = context.createSnippet(createShortcut, extend: screenInsertions);
final shortcutsFile = generator.modifyFile(context, generator.pathStateTestShortcutsFile);
shortcutsFile.addLinesAfter(context, AFCodeRegExp.startShortcutsClass, shortcut.lines);
// import the screen to the state test shortcuts.
shortcutsFile.importFile(context, screenFile);
// add exports for files
final isStartupScreen = uiName == AFGenerateUISubcommand.nameStartupScreen;
if(isStartupScreen) {
generator.addExportsForFiles(context, args, [
screenFile
]);
generator.declareUIIDDirect(context, AFGenerateUISubcommand.nameButtonIncrementRouteParam, controlSettingsWidget);
generator.declareUIIDDirect(context, AFGenerateUISubcommand.nameTextCountRouteParam, controlSettingsWidget);
}
final generatePrototypes = AFibD.config.generateUIPrototypes;
if(generatePrototypes) {
final smokeTestImpl = context.createSnippet(controlSettings.smokeTestImpl);
// create a new screen test files
final protoName = "${uiName}InitialPrototype";
final protoId = generator.declarePrototypeID(context, protoName);
final pathScreenTest = generator.pathScreenTest(uiName, controlSettings);
final createProto = context.createSnippet(createPrototype ?? controlSettings.createPrototype, insertions: {
SnippetCreateScreenPrototypeT.insertNavigatePushParams: memberVariables?.initialValueDeclaration ?? AFSourceTemplate.empty,
});
final screenTestFile = context.createFile(pathScreenTest, ScreenTestT.core(), insertions: {
AFSourceTemplate.insertExtraImportsInsertion: "",
AFSourceTemplate.insertMainTypeInsertion: uiName,
ScreenT.insertScreenID: protoId,
ScreenT.insertControlTypeSuffix: controlSettings.suffix,
ScreenTestT.insertDeclarePrototype: createProto,
ScreenTestT.insertSmokeTestImpl: smokeTestImpl,
SnippetCreateScreenPrototypeT.insertFullTestDataID: generator.stateFullLoginID,
});
screenTestFile.importFile(context, screenFile);
// add in a link to the defining function to the main tests file.
final pathScreenTests = generator.pathScreenTests;
final screenTestsFile = generator.modifyFile(context, pathScreenTests);
// add the imports
screenTestsFile.importFile(context, screenTestFile);
final callFunction = context.createSnippet(SnippetCallDefineScreenTest(), extend: screenInsertions);
screenTestsFile.addLinesAfter(context, AFCodeRegExp.startDefineUIProtoypesFunction, callFunction.lines);
}
return screenFile;
}