From c1866a1a8b26bae840bb12f3ec91fbb66c81e9ca Mon Sep 17 00:00:00 2001 From: DASHU <385321165@qq.com> Date: Wed, 18 Sep 2024 10:18:28 +0800 Subject: [PATCH] add bookmark and bookmark page --- lib/const/router_path.dart | 1 + lib/data/bookmark_db.dart | 13 ++++ lib/main.dart | 2 + lib/router/bookmark/bookmark_router.dart | 79 +++++++++++++++++++++ lib/router/index/index_router.dart | 11 ++- lib/router/index/web_control_component.dart | 23 ++++++ lib/router/me/me_router.dart | 7 +- 7 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 lib/router/bookmark/bookmark_router.dart diff --git a/lib/const/router_path.dart b/lib/const/router_path.dart index d0d823d..8bef615 100644 --- a/lib/const/router_path.dart +++ b/lib/const/router_path.dart @@ -8,4 +8,5 @@ class RouterPath { static const String ADD_REMOTE_APP = "/addRemoteApp"; static const String APP_DETAIL = "/appDetail"; static const String HISTORY = "/history"; + static const String BOOKMARK = "/bookmark"; } diff --git a/lib/data/bookmark_db.dart b/lib/data/bookmark_db.dart index 2b8f34d..8989842 100644 --- a/lib/data/bookmark_db.dart +++ b/lib/data/bookmark_db.dart @@ -14,4 +14,17 @@ class BookmarkDB { var sql = "select count(1) from bookmark"; return Sqflite.firstIntValue(await db.rawQuery(sql)); } + + static Future> all({DatabaseExecutor? db}) async { + List objs = []; + List? arguments = []; + db = await DB.getDB(db); + var sql = "select * from bookmark order by created_at desc"; + List> list = await db.rawQuery(sql, arguments); + for (var i = 0; i < list.length; i++) { + var json = list[i]; + objs.add(Bookmark.fromJson(json)); + } + return objs; + } } diff --git a/lib/main.dart b/lib/main.dart index 237f890..d22ebd6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,6 +16,7 @@ import 'package:nowser/provider/web_provider.dart'; import 'package:nowser/router/app_detail/app_detail_router.dart'; import 'package:nowser/router/apps/add_remote_app_router.dart'; import 'package:nowser/router/apps/apps_router.dart'; +import 'package:nowser/router/bookmark/bookmark_router.dart'; import 'package:nowser/router/history/history_router.dart'; import 'package:nowser/router/index/index_router.dart'; import 'package:nowser/router/keys/keys_router.dart'; @@ -104,6 +105,7 @@ class _MyApp extends State { RouterPath.ADD_REMOTE_APP: (context) => AddRemoteAppRouter(), RouterPath.APP_DETAIL: (context) => AppDetailRouter(), RouterPath.HISTORY: (context) => HistoryRouter(), + RouterPath.BOOKMARK: (context) => BookmarkRouter(), }; return MultiProvider( diff --git a/lib/router/bookmark/bookmark_router.dart b/lib/router/bookmark/bookmark_router.dart new file mode 100644 index 0000000..a7e8e07 --- /dev/null +++ b/lib/router/bookmark/bookmark_router.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:nowser/component/cust_state.dart'; +import 'package:nowser/component/url_list_item_componnet.dart'; +import 'package:nowser/data/browser_history_db.dart'; +import 'package:nowser/util/router_util.dart'; + +import '../../component/appbar_back_btn_component.dart'; +import '../../const/base.dart'; +import '../../data/bookmark.dart'; +import '../../data/bookmark_db.dart'; + +class BookmarkRouter extends StatefulWidget { + @override + State createState() { + return _BookmarkRouter(); + } +} + +class _BookmarkRouter extends CustState { + List bookmarks = []; + + @override + Future onReady(BuildContext context) async { + bookmarks = await BookmarkDB.all(); + setState(() {}); + } + + @override + Widget doBuild(BuildContext context) { + var themeData = Theme.of(context); + + return Scaffold( + appBar: AppBar( + leading: AppbarBackBtnComponent(), + title: Text( + "Bookmarks", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: themeData.textTheme.bodyLarge!.fontSize, + ), + ), + actions: [ + // GestureDetector( + // onTap: () {}, + // child: Container( + // padding: const EdgeInsets.all(Base.BASE_PADDING), + // child: Icon(Icons.delete_sweep_outlined), + // ), + // ), + ], + ), + body: ListView.builder( + itemBuilder: (context, index) { + if (index >= bookmarks.length) { + return null; + } + + var bookmark = bookmarks[index]; + + var main = Container( + child: GestureDetector( + onTap: () { + RouterUtil.back(context, bookmark.url); + }, + child: UrlListItemComponnet( + image: bookmark.favicon, + title: bookmark.title ?? "", + url: bookmark.url ?? "", + ), + ), + ); + + return main; + }, + itemCount: bookmarks.length, + ), + ); + } +} diff --git a/lib/router/index/index_router.dart b/lib/router/index/index_router.dart index acdcda4..cb72c09 100644 --- a/lib/router/index/index_router.dart +++ b/lib/router/index/index_router.dart @@ -4,6 +4,7 @@ import 'package:nowser/component/cust_state.dart'; import 'package:nowser/main.dart'; import 'package:nowser/provider/web_provider.dart'; import 'package:nowser/router/index/index_web_component.dart'; +import 'package:nowser/util/router_util.dart'; import 'package:provider/provider.dart'; import '../../component/webview/webview_component.dart'; @@ -84,16 +85,22 @@ class _IndexRouter extends CustState enableDrag: true, showDragHandle: true, ); + bottomSheetController!.closed.then((v) { + bottomSheetController = null; + }); } bool closeControl() { bool closeAble = false; try { if (bottomSheetController != null) { - bottomSheetController!.close(); + // bottomSheetController!.close(); closeAble = true; + RouterUtil.back(context); } - } catch (e) {} + } catch (e) { + print(e); + } bottomSheetController = null; return closeAble; } diff --git a/lib/router/index/web_control_component.dart b/lib/router/index/web_control_component.dart index e298720..3a4a0f0 100644 --- a/lib/router/index/web_control_component.dart +++ b/lib/router/index/web_control_component.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; import 'package:nowser/const/base.dart'; +import 'package:nowser/const/router_path.dart'; import 'package:nowser/provider/web_provider.dart'; import 'package:nowser/router/index/web_control_btn_component.dart'; +import 'package:nowser/util/router_util.dart'; import 'package:provider/provider.dart'; class WebControlComponent extends StatefulWidget { @@ -87,6 +89,13 @@ class _WebControlComponent extends State { Icons.bookmark_border, size: 30, ), + onTap: () async { + var url = + await RouterUtil.router(context, RouterPath.BOOKMARK); + if (webProvider.currentGoTo(url)) { + RouterUtil.back(context); + } + }, ), ), Expanded( @@ -96,6 +105,13 @@ class _WebControlComponent extends State { Icons.bookmark_add_outlined, size: 30, ), + onTap: () { + var webInfo = webProvider.currentWebInfo(); + if (webInfo != null) { + webProvider.addBookmark(webInfo); + RouterUtil.back(context); + } + }, ), ), Expanded( @@ -105,6 +121,13 @@ class _WebControlComponent extends State { Icons.history, size: 30, ), + onTap: () async { + var url = + await RouterUtil.router(context, RouterPath.HISTORY); + if (webProvider.currentGoTo(url)) { + RouterUtil.back(context); + } + }, ), ), Expanded( diff --git a/lib/router/me/me_router.dart b/lib/router/me/me_router.dart index 09f7d27..8e87b7a 100644 --- a/lib/router/me/me_router.dart +++ b/lib/router/me/me_router.dart @@ -153,6 +153,12 @@ class _MeRouter extends CustState { num: bookmarkNum, name: "Bookmark", iconData: Icons.bookmark, + onTap: () async { + var url = await RouterUtil.router(context, RouterPath.BOOKMARK); + if (webProvider.currentGoTo(url)) { + RouterUtil.back(context); + } + }, )); webItemList.add(MeRouterWebItemComponent( num: historyNum, @@ -160,7 +166,6 @@ class _MeRouter extends CustState { iconData: Icons.history, onTap: () async { var url = await RouterUtil.router(context, RouterPath.HISTORY); - print("url $url"); if (webProvider.currentGoTo(url)) { RouterUtil.back(context); }