详情页开发中

This commit is contained in:
胡天 2023-07-24 18:31:24 +08:00
parent 101d1a42fa
commit 3f86568f5c
14 changed files with 240 additions and 7 deletions

View File

@ -32,6 +32,7 @@ class MyApp extends StatelessWidget {
title: 'News', title: 'News',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: AppTheme.light, theme: AppTheme.light,
unknownRoute: AppPages.notFoundRoute,
initialRoute: AppPages.Initial, initialRoute: AppPages.Initial,
getPages: AppPages.pages, getPages: AppPages.pages,
navigatorObservers: [AppPages.observer], navigatorObservers: [AppPages.observer],
@ -56,6 +57,7 @@ class MyApp extends StatelessWidget {
maxOverScrollExtent: 100, maxOverScrollExtent: 100,
footerTriggerDistance: 150, footerTriggerDistance: 150,
child: Obx(() { child: Obx(() {
// todo
return ConfigService.to.isGrayFilter.isTrue ? ColorFiltered( return ConfigService.to.isGrayFilter.isTrue ? ColorFiltered(
colorFilter: ColorFilter.mode(Colors.grey, BlendMode.color), colorFilter: ColorFilter.mode(Colors.grey, BlendMode.color),
child: app, child: app,

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'bookmarks_controller.dart';
class BookmarksBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => BookmarksController());
}
}

View File

@ -0,0 +1,7 @@
import 'package:get/get.dart';
import 'bookmarks_state.dart';
class BookmarksController extends GetxController {
final BookmarksState state = BookmarksState();
}

View File

@ -0,0 +1,16 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'bookmarks_controller.dart';
class BookmarksPage extends GetView<BookmarksController> {
const BookmarksPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
child: Text('BookmarksPage'),
);
}
}

View File

@ -0,0 +1,5 @@
class BookmarksState {
BookmarksState() {
///Initialize variables
}
}

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'detail_controller.dart';
class DetailBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => DetailController());
}
}

View File

@ -0,0 +1,88 @@
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));
}
}

View File

@ -0,0 +1,71 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:news_getx/modules/widgets/app_bar.dart';
import 'package:news_getx/theme/app_colors.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'detail_controller.dart';
class DetailPage extends GetView<DetailController> {
DetailPage({Key? key}) : super(key: key);
//
AppBar _buildAppBar() {
return transparentAppBar(
leading: IconButton(
onPressed: () {},
icon: Icon(
Icons.arrow_back,
color: AppColors.primaryText,
),
),
actions: [
IconButton(
onPressed: () {},
icon: Icon(
Icons.bookmark_border,
color: AppColors.primaryText,
),
),
IconButton(
onPressed: () {},
icon: Icon(
Icons.share,
color: AppColors.primaryText,
),
),
]);
}
Widget _buildPageTitle() {
return Text('data');
}
Widget _buildPageHeader() {
return Text('data');
}
Widget _buildWebView() {
return WebViewWidget(
controller: controller.webViewController,
);
}
@override
Widget build(BuildContext context) {
return _buildWebView();
return Scaffold(
appBar: _buildAppBar(),
body: SingleChildScrollView(
child: Column(
children: [
_buildPageTitle(),
Divider(height: 1),
_buildPageHeader(),
_buildWebView(),
],
),
),
);
}
}

View File

@ -0,0 +1,5 @@
import 'package:news_getx/data/model/news.dart';
class DetailState {
late final NewsItem item;
}

View File

@ -19,6 +19,7 @@ class MainController extends GetxController {
/// ///
// //
asyncLoadAllData() async { asyncLoadAllData() async {
// todo
state.categories = await newsRepository.categories(cacheDisk: true); state.categories = await newsRepository.categories(cacheDisk: true);
state.channels = await newsRepository.channels(cacheDisk: true); state.channels = await newsRepository.channels(cacheDisk: true);
// //

View File

@ -4,6 +4,7 @@ import 'package:get/get.dart';
import 'package:news_getx/data/services/config.dart'; import 'package:news_getx/data/services/config.dart';
import 'package:news_getx/modules/main/main_controller.dart'; import 'package:news_getx/modules/main/main_controller.dart';
import 'package:news_getx/modules/widgets/image.dart'; import 'package:news_getx/modules/widgets/image.dart';
import 'package:news_getx/routes/app_pages.dart';
import 'package:news_getx/theme/app_colors.dart'; import 'package:news_getx/theme/app_colors.dart';
import 'package:news_getx/utils/date.dart'; import 'package:news_getx/utils/date.dart';
@ -21,7 +22,7 @@ class NewsRecommendWidget extends GetView<MainController> {
// //
InkWell( InkWell(
onTap: () { onTap: () {
print("进入详情页"); Get.toNamed(AppRoutes.Detail, arguments: controller.state.newsRecommend!);
}, },
child: netImageCached( child: netImageCached(
controller.state.newsRecommend?.thumbnail ?? "", controller.state.newsRecommend?.thumbnail ?? "",

View File

@ -2,7 +2,7 @@ import 'package:get/get.dart';
class NotFoundController extends GetxController { class NotFoundController extends GetxController {
// title // title
final _title = "".obs; final _title = "Not Found".obs;
set title(value) => _title.value = value; set title(value) => _title.value = value;
get title => _title.value; get title => _title.value;

View File

@ -8,6 +8,8 @@ import 'package:news_getx/modules/application/application_page.dart';
import 'package:news_getx/modules/bookmarks/bookmarks_binding.dart'; import 'package:news_getx/modules/bookmarks/bookmarks_binding.dart';
import 'package:news_getx/modules/category/category_binding.dart'; import 'package:news_getx/modules/category/category_binding.dart';
import 'package:news_getx/modules/category/category_page.dart'; import 'package:news_getx/modules/category/category_page.dart';
import 'package:news_getx/modules/detail/detail_binding.dart';
import 'package:news_getx/modules/detail/detail_page.dart';
import 'package:news_getx/modules/main/main_binding.dart'; import 'package:news_getx/modules/main/main_binding.dart';
import 'package:news_getx/modules/not_found/not_found_binding.dart'; import 'package:news_getx/modules/not_found/not_found_binding.dart';
import 'package:news_getx/modules/not_found/not_found_page.dart'; import 'package:news_getx/modules/not_found/not_found_page.dart';
@ -27,6 +29,14 @@ abstract class AppPages {
static final NavigatorObserver observer = AppNavigatorObserver(); static final NavigatorObserver observer = AppNavigatorObserver();
static List<String> history = []; static List<String> history = [];
// 404
static final notFoundRoute = GetPage(
name: AppRoutes.NotFound,
page: () => NotFoundPage(),
binding: NotFoundBinding(),
);
//
static final pages = [ static final pages = [
// //
GetPage( GetPage(
@ -35,21 +45,18 @@ abstract class AppPages {
binding: WelcomeBinding(), binding: WelcomeBinding(),
middlewares: [RouteWelcomeMiddleware()], middlewares: [RouteWelcomeMiddleware()],
), ),
//
GetPage( GetPage(
name: AppRoutes.Signin, name: AppRoutes.Signin,
page: () => SignInPage(), page: () => SignInPage(),
binding: SignInBinding(), binding: SignInBinding(),
), ),
//
GetPage( GetPage(
name: AppRoutes.Signup, name: AppRoutes.Signup,
page: () => SignUpPage(), page: () => SignUpPage(),
binding: SignUpBinding(), binding: SignUpBinding(),
), ),
GetPage(
name: AppRoutes.NotFound,
page: () => NotFoundPage(),
binding: NotFoundBinding(),
),
// //
GetPage( GetPage(
name: AppRoutes.Application, name: AppRoutes.Application,
@ -65,5 +72,14 @@ abstract class AppPages {
RouteAuthMiddleware(), RouteAuthMiddleware(),
], ],
), ),
//
GetPage(
name: AppRoutes.Detail,
page: () => DetailPage(),
binding: DetailBinding(),
middlewares: [
RouteAuthMiddleware(),
],
),
]; ];
} }

View File

@ -8,4 +8,5 @@ abstract class AppRoutes {
static const Application = '/application'; static const Application = '/application';
static const Category = '/category'; static const Category = '/category';
static const Detail = '/detail';
} }