news_getx/lib/modules/detail/detail_controller.dart

89 lines
3.2 KiB
Dart

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) {
print(message.message);
var webHeight = double.tryParse(message.message);
if (webHeight != null) {
webViewHeight.value = webHeight;
}
},
);
}
// 获取页面高度
_getWebViewHeight() async {
// await (await webViewController.future)?.evaluateJavascript('''
// try {
// // Invoke.postMessage([document.body.clientHeight,document.documentElement.clientHeight,document.documentElement.scrollHeight]);
// let scrollHeight = document.documentElement.scrollHeight;
// if (scrollHeight) {
// Invoke.postMessage(scrollHeight);
// }
// } catch {}
// ''');
}
void initWebController() {
webViewController.setJavaScriptMode(JavaScriptMode.unrestricted);
webViewController.setBackgroundColor(Colors.black);
webViewController.setNavigationDelegate(NavigationDelegate(
onProgress: (int progress) {},
onPageStarted: (String url) {},
onPageFinished: (String url) {
_getWebViewHeight();
isPageFinished.value = true;
},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
// if (request.url != '$ServerApiUrl/news/content/${state.item.id}') {
if (request.url != 'https://www.youtube.com/') {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
));
// 注册js回调
_invokeJavascriptChannel();
}
/// 声明周期
@override
void onInit() {
super.onInit();
NewsItem newsItem = Get.arguments;
print(newsItem);
state.item = newsItem;
// 初始化WebViewController信息
initWebController();
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";
webViewController.loadRequest(Uri.parse(url));
}
}