link_cubit.dart 2.05 KB
import 'dart:io';

import 'package:appframe/config/routes.dart';
import 'package:appframe/ui/widgets/ios_edge_swipe_detector.dart';
import 'package:equatable/equatable.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 LinkState extends Equatable {
  final bool loaded;
  final String url;

  const LinkState({this.loaded = false, this.url = ''});

  LinkState copyWith({bool? loaded, String? url}) {
    return LinkState(loaded: loaded ?? this.loaded, url: url ?? this.url);
  }

  @override
  List<Object?> get props => [loaded, url];
}

class LinkCubit extends Cubit<LinkState> {
  late final WebViewController _controller;

  WebViewController get controller => _controller;

  LinkCubit(super.initialState) {
    // 初始化 iOS 边缘滑动监听
    if (Platform.isIOS) {
      IosEdgeSwipeDetector.init();
      IosEdgeSwipeDetector.onEdgeSwipe(() {
        debugPrint("");
        debugPrint("link page 检测到左边缘滑动,Flutter 收到通知");
        debugPrint("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
        debugPrint("");
      });
    }

    _controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onUrlChange: (UrlChange url) {},
          onPageStarted: (String url) {},
          onPageFinished: (String url) {
            _controller.runJavaScript(
              'document.querySelector("meta[name=viewport]").setAttribute("content", "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no")',
            );
            _finishLoading();
          },
        ),
      )
    ..loadRequest(Uri.parse(state.url));
  }

  void _finishLoading() {
    emit(state.copyWith(loaded: true));
  }

  Future<void> handleBack(BuildContext context) async {
    if (await _controller.canGoBack()) {
      _controller.goBack();
    } else {
      // context.pop(true);
      router.pop('ok');
    }
  }
}