link_page.dart 2.21 KB
import 'dart:io';

import 'package:appframe/bloc/link_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:webview_flutter/webview_flutter.dart';

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

  @override
  Widget build(BuildContext buildContext) {
    final Map<String, dynamic>? extraData = GoRouterState.of(buildContext).extra as Map<String, dynamic>?;
    final String url = extraData?['url'];
    final String? title = extraData?['title'];
    final int screenType = extraData?['screenType'] ?? 1; // 1: 竖屏, 2: 横屏

    return BlocProvider(
      create: (context) => LinkCubit(LinkState(url: url, title: title ?? '', screenType: screenType)),
      child: BlocConsumer<LinkCubit, LinkState>(
        builder: (ctx, state) {
          final scaffold = Scaffold(
            appBar: AppBar(
              title: Text(state.title, style: TextStyle(color: Colors.white, fontSize: 18)),
              centerTitle: true,
              backgroundColor: Color(0xFF7691FA),
              iconTheme: IconThemeData(color: Colors.white),
              leading: IconButton(
                icon: const Icon(Icons.arrow_back, color: Colors.white),
                onPressed: () {
                  ctx.read<LinkCubit>().handleBack();
                },
              ),
            ),
            body: state.loaded
                ? SizedBox(
                    height: MediaQuery.of(ctx).size.height - 120, // 减去100像素留空
                    child: WebViewWidget(
                      controller: ctx.read<LinkCubit>().controller,
                    ),
                  )
                : const Center(child: CircularProgressIndicator(color: Color(0xFF7691fa))),
          );

          if (Platform.isIOS) {
            return scaffold;
          }

          return PopScope(
            canPop: false,
            onPopInvokedWithResult: (didPop, result) {
              if (didPop) {
                return;
              }
              ctx.read<LinkCubit>().handleBack();
            },
            child: scaffold,
          );
        },
        listener: (context, state) {},
      ),
    );
  }
}