news_getx/lib/modules/detail/detail_controller.dart

91 lines
3.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:news_getx/config/server.dart';
import 'package:news_getx/data/model/news.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'detail_state.dart';
class DetailController extends GetxController {
/// 响应式成员变量
// 页面是否加载完成
var isPageFinished = false.obs;
// webView高度
var webViewHeight = 200.0.obs;
/// 成员变量
// 页面详情
final DetailState state = DetailState();
WebViewController webViewController = WebViewController();
/// 方法
// 注册js回调
void _invokeJavascriptChannel() {
webViewController.addJavaScriptChannel(
'Invoke',
onMessageReceived: (JavaScriptMessage message) {
var webHeight = double.tryParse(message.message);
if (webHeight != null) {
webViewHeight.value = webHeight;
}
},
);
}
// 获取页面高度
_getWebViewHeight() async {
// 一直变动高度的 设置最大高度变更次数
await webViewController.runJavaScript("""
// 设置最大高度变更次数
let retryNum = 3;
const resizeObserver = new ResizeObserver(entries => {
if (retryNum > 0) {
Invoke.postMessage(document.documentElement.scrollHeight.toString());
retryNum -= 1;
}
});
resizeObserver.observe(document.body);
""");
}
void initWebController() {
// 控制器设置
webViewController.setJavaScriptMode(JavaScriptMode.unrestricted);
webViewController.setBackgroundColor(Colors.transparent);
webViewController.setNavigationDelegate(NavigationDelegate(
onProgress: (int progress) {},
onPageStarted: (String url) {},
onPageFinished: (String url) {
_getWebViewHeight();
isPageFinished.value = true;
},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
// 限制内部导航的url
if (request.url != '$ServerApiUrl/news/content/${state.item.id}') {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
));
// 注册js回调
_invokeJavascriptChannel();
}
/// 声明周期
@override
void onInit() {
super.onInit();
NewsItem newsItem = Get.arguments;
state.item = newsItem;
// 初始化WebViewController信息
initWebController();
// TODO 如果遇到页面是固定100vh的那么获取到的高度就是初始的SizeBox的高度
// const url = "https://www.baidu.com/#iact=wiseindex%2Ftabs%2Fnews%2Factivity%2Fnewsdetail%3D%257B%2522linkData%2522%253A%257B%2522name%2522%253A%2522iframe%252Fmib-iframe%2522%252C%2522id%2522%253A%2522feed%2522%252C%2522index%2522%253A0%252C%2522url%2522%253A%2522https%253A%252F%252Fmbd.baidu.com%252Fnewspage%252Fdata%252Flandingpage%253Fs_type%253Dnews%2526dsp%253Dwise%2526context%253D%25257B%252522nid%252522%25253A%252522news_9417572788407561368%252522%25257D%2526pageType%253D1%2526n_type%253D1%2526p_from%253D-1%2526rec_src%253D52%2526innerIframe%253D1%2526browserId%253D25%2522%252C%2522isThird%2522%253Afalse%252C%2522title%2522%253Anull%257D%257D";
// const url = "https://blog.csdn.net/m0_55635384/article/details/129020261";
webViewController.loadRequest(Uri.parse(newsItem.url!));
}
}