Implementação de Tela de Início no HarmonyOS com Flutter

Visão Geral da Solução

O projeto Flutter android_splash_screen demonstra como criar uma transição suave entre uma tela de início nativa no Android 12+ e a interface do Flutter. Embora não seja um pacote convencional, fornece um esquema completo que pode ser adaptado para implementações semelhantes no HarmonyOS. A solução aborda a criação de uma tela de início com enimações e a sincronização precisa com o carregamento do Fluter.

Configuração Inicial no Projeto

Para utilizar a referência, adicione a seguinte dependência ao arquivo pubspec.yaml do seu projeto Flutter no HarmonyOS:

dependencies:
  android_splash_screen:
    git:
      url: "https://gitcode.com/openharmony-tpc/flutter_packages.git"
      path: "packages/flutter_samples/android_splash_screen"

Execute flutter pub get para baixar os arquivos de exemplo.

Configuração da Página de Início no HarmonyOS

No diretório resources do projeto HarmonyOS, crie os recursos visuais para a tela de início. Atualize o arquivo config.json5 conforme abaixo para registrar a ability de splash screen:

{
  "module": {
    "abilities": [
      {
        "name": "MainAbility",
        "launchType": "standard",
        "icon": "$media:app_icon",
        "label": "$string:app_label",
        "splashScreenAbility": "$ability:LaunchScreenAbility",
        "skills": [
          {
            "entities": ["entity.system.home"],
            "actions": ["action.system.home"]
          }
        ]
      },
      {
        "name": "LaunchScreenAbility",
        "type": "splashScreen",
        "splashScreen": {
          "backgroundColor": "#EFEFEF",
          "image": {
            "imageResource": "$media:launch_background",
            "alignment": { "x": 0.5, "y": 0.5 },
            "objectFit": "cover"
          },
          "duration": 1500
        }
      }
    ]
  }
}

Desenvolvimento da Ability de Tela de Início

Crie um arquivo LaunchScreenAbility.ets com a lógica de controle da tela de início. A classe abaixo gerencia a janela e a transição para a ability principal:

import Ability from '@ohos.app.ability.Ability';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';

export default class LaunchScreenAbility extends Ability {
  onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.loadContent('pages/LaunchView', (err) => {
      if (err) {
        console.error('Erro ao carregar a tela de início.');
        return;
      }
      windowStage.getMainWindow().then((win) => {
        win.setFullScreen(true);
        win.setSystemBarEnable(['status', 'navigation']);
      });
    });
  }

  onForeground() {
    setTimeout(() => {
      let want: Want = {
        bundleName: this.context.abilityInfo.bundleName,
        abilityName: 'MainAbility'
      };
      this.startAbility(want).then(() => {
        this.terminateSelf();
      });
    }, 1500);
  }
}

Criação da Interface de Tela de Início

Implemente o componente visual da tela de início usando ArkTS. O exemplo abaixo inclui uma animação de fade-in e navegação automática:

import router from '@ohos.router';

@Entry
@Component
struct LaunchView {
  @State opacityValue: number = 0;
  @State scaleValue: number = 0.9;

  aboutToAppear() {
    animateTo({
      duration: 800,
      curve: Curve.EaseInOut,
      onFinish: () => {
        setTimeout(() => {
          this.navigateAway();
        }, 700);
      }
    }, () => {
      this.opacityValue = 1;
      this.scaleValue = 1;
    });
  }

  navigateAway() {
    animateTo({
      duration: 400,
      curve: Curve.EaseIn
    }, () => {
      this.opacityValue = 0;
    });
    setTimeout(() => {
      router.replaceUrl({ url: 'pages/Main' });
    }, 400);
  }

  build() {
    Column() {
      Image($r('app.media.logo'))
        .width(100)
        .height(100)
        .opacity(this.opacityValue)
        .scale({ x: this.scaleValue, y: this.scaleValue })
      Text('Aplicativo HarmonyOS Flutter')
        .fontSize(20)
        .fontColor('#444444')
        .margin({ top: 16 })
        .opacity(this.opacityValue)
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .backgroundColor('#EFEFEF')
  }
}

Integração com o Flutter

No arquivo principle do Flutter (main.dart), configure a aplicação para garantir a transição suave. Ajuste os tempos de inicialização e a tela de carregamento para coincidir com a duração da tela de início HarmonyOS:

import 'package:flutter/material.dart';
import 'dart:async';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await loadResources();
  runApp(const HarmonyApp());
}

Future<void> loadResources() async {
  // Simulação de carregamento de recursos
  await Future.delayed(const Duration(seconds: 1));
}

class HarmonyApp extends StatelessWidget {
  const HarmonyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App HarmonyOS',
      theme: ThemeData(primarySwatch: Colors.teal),
      home: const InitialScreen(),
    );
  }
}

class InitialScreen extends StatefulWidget {
  const InitialScreen({super.key});

  @override
  State<InitialScreen> createState() => _InitialScreenState();
}

class _InitialScreenState extends State<InitialScreen> {
  @override
  void initState() {
    super.initState();
    Timer(const Duration(milliseconds: 500), () {
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (context) => const MainScreen()),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey.shade200,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset('assets/logo.png', width: 100, height: 100),
            const SizedBox(height: 16),
            const Text('Aplicativo HarmonyOS Flutter', style: TextStyle(fontSize: 20)),
          ],
        ),
      ),
    );
  }
}

class MainScreen extends StatelessWidget {
  const MainScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Página Principal')),
      body: const Center(child: Text('Bem-vindo ao aplicativo!')),
    );
  }
}

Tags: Flutter HarmonyOS SplashScreen ArkTS Dart

Publicado em 7-18 23:08