Insert PantallaTutorialAyuda.mostrarSiProcede between the welcome screen and the recurring what's-new dialog in _mostrarFlujoPrimerLanzamiento, so the carousel shows once on every install -- fresh AND existing installs upgrading to this version -- via its own independent one-time flag, without racing either surface.
72 lines
2.2 KiB
Dart
72 lines
2.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../l10n/gen/app_localizations.dart';
|
|
import '../tema/pluriwave_theme.dart';
|
|
import 'pluri_layout.dart';
|
|
|
|
/// S1 (Tier 1 visual fidelity): the prototype (`t4`) draws no global
|
|
/// `AppBar` — each root paints its own 56px title row inside its own
|
|
/// content instead (e.g. Alarmas `height:56px;padding:0 12px 0 20px`,
|
|
/// Ajustes `height:56px;padding:0 20px`, Explorar `height:56px`). This
|
|
/// widget is that row, reused by all 5 roots so the sleep-timer action
|
|
/// that used to live on `app.dart`'s single shared `AppBar` stays
|
|
/// reachable from every tab.
|
|
class PluriRootHeader extends StatelessWidget {
|
|
const PluriRootHeader({
|
|
super.key,
|
|
required this.title,
|
|
required this.onSleepTimer,
|
|
this.actions = const <Widget>[],
|
|
});
|
|
|
|
final String title;
|
|
final VoidCallback onSleepTimer;
|
|
|
|
/// S2 (Tier 1 visual fidelity): the now-retired `PluriScreenHeader` was
|
|
/// also the only home for a couple of roots' SINGLE functional action —
|
|
/// Alarmas' create-alarm button, Buscar's filters entry point. Rendered
|
|
/// before the shared bedtime button; empty by default (every other root
|
|
/// needs nothing extra here).
|
|
final List<Widget> actions;
|
|
|
|
static const double height = 56;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final type = context.pluriType;
|
|
final l10n = AppLocalizations.of(context);
|
|
return SizedBox(
|
|
height: height,
|
|
child: Padding(
|
|
// S5: the prototype's own header padding is title-tier on the
|
|
// left, row-tier on the right (t4 e.g. Alarmas
|
|
// `padding:0 12px 0 20px`).
|
|
padding: const EdgeInsets.fromLTRB(
|
|
PluriLayout.titleHorizontal,
|
|
0,
|
|
PluriLayout.rowHorizontal,
|
|
0,
|
|
),
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: Text(
|
|
title,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: type.sectionTitle,
|
|
),
|
|
),
|
|
...actions,
|
|
IconButton(
|
|
icon: const Icon(Icons.bedtime_outlined),
|
|
tooltip: l10n.sleepTimer,
|
|
onPressed: onSleepTimer,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|