link_cubit.dart 1.64 KB
import 'package:appframe/config/routes.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
  // TODO: implement props
  List<Object?> get props => [loaded, url];
}

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

  WebViewController get controller => _controller;

  LinkCubit(super.initialState) {
    _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');
    }
  }
}