웹 브라우저 버튼: 열려 있는 브라우저로 돌아가기

브라우저에서 [다운로드] → "목록 보기" 로 다운로드 목록에 간 뒤 위쪽 [웹 브라우저] 를 누르면
새 브라우저가 홈 주소로 열려 보던 페이지를 잃었다. 이미 열린 브라우저가 있으면 그 화면까지 돌아간다 (BrowserPage.open).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main
RyuJongJin 2026-10-03 04:38:29 +09:00
parent 6c15f74e72
commit 39f65f414c
3 changed files with 38 additions and 11 deletions

View File

@ -278,8 +278,8 @@ Future<void> main(List<String> args) async {
}
// 시작 화면을 "웹 브라우저" 로 정했으면 브라우저를 연다 (MKV 화면은 그 아래에 있음)
if (controller.settings.startScreen == 'browser') {
navigatorKey.currentState?.push(MaterialPageRoute<void>(
builder: (_) => BrowserPage(c: controller, downloads: downloads, bookmarks: bookmarks)));
final nav = navigatorKey.currentState;
if (nav != null) unawaited(BrowserPage.open(nav, c: controller, downloads: downloads, bookmarks: bookmarks));
}
await checkRequiredTools(ctx, services.shell);
final ctx2 = navigatorKey.currentContext;
@ -414,8 +414,8 @@ Future<void> runAndroid(String dataDir) async {
}
} catch (_) {}
if (controller.settings.startScreen == 'browser') {
navigatorKey.currentState?.push(MaterialPageRoute<void>(
builder: (_) => BrowserPage(c: controller, downloads: downloads, bookmarks: bookmarks)));
final nav = navigatorKey.currentState;
if (nav != null) unawaited(BrowserPage.open(nav, c: controller, downloads: downloads, bookmarks: bookmarks));
}
// 새 버전 확인 (하루 한 번, 환경 설정에서 끌 수 있음)
final ctx = navigatorKey.currentContext;

View File

@ -57,8 +57,7 @@ class AppNavButtons extends StatelessWidget {
final nav = Navigator.of(context);
nav.popUntil((r) => r.isFirst);
if (scope != null && scope.controller.settings.startScreen == 'browser' && scope.bookmarks != null) {
nav.push(MaterialPageRoute<void>(
builder: (_) => BrowserPage(c: scope.controller, downloads: scope.downloads, bookmarks: scope.bookmarks!)));
BrowserPage.open(nav, c: scope.controller, downloads: scope.downloads, bookmarks: scope.bookmarks!);
}
}
@ -100,11 +99,8 @@ class AppNavButtons extends StatelessWidget {
onBrowserPage ? '웹 브라우저 (지금 여기)' : '웹 브라우저',
scope?.bookmarks == null || onBrowserPage
? null
: () => Navigator.push(
context,
MaterialPageRoute<void>(
builder: (_) =>
BrowserPage(c: scope!.controller, downloads: scope.downloads, bookmarks: scope.bookmarks!))),
: () => BrowserPage.open(Navigator.of(context),
c: scope!.controller, downloads: scope.downloads, bookmarks: scope.bookmarks!),
here: onBrowserPage,
),
btn(const Icon(Icons.arrow_back), '뒤로', atRoot ? null : () => Navigator.maybePop(context)),

View File

@ -71,6 +71,30 @@ class BrowserPage extends StatefulWidget {
@override
State<BrowserPage> createState() => _BrowserPageState();
/// 브라우저 화면의 경로 이름 (이미 열려 있으면 그 화면으로 돌아가기 위해)
static const routeName = 'browser';
/// 열려 있는 브라우저 화면 수
static int _open = 0;
/// 웹 브라우저로: 이미 열린 브라우저가 있으면 그 화면으로 돌아가고 (보던 페이지 그대로),
/// 없으면 새로 연다. 다운로드 목록 · 플레이어 등에서 브라우저 버튼을 눌러도 보던 페이지를 잃지 않는다.
static Future<void> open(NavigatorState nav,
{required AppController c, DownloadManager? downloads, required BookmarksController bookmarks}) async {
if (_open > 0) {
var found = false;
nav.popUntil((r) {
if (r.settings.name == routeName) found = true;
return found || r.isFirst;
});
if (found) return;
}
await nav.push(MaterialPageRoute<void>(
settings: const RouteSettings(name: routeName),
builder: (_) => BrowserPage(c: c, downloads: downloads, bookmarks: bookmarks),
));
}
}
class _BrowserPageState extends State<BrowserPage> {
@ -108,8 +132,15 @@ class _BrowserPageState extends State<BrowserPage> {
BookmarksController get bm => widget.bookmarks;
@override
void initState() {
super.initState();
BrowserPage._open++;
}
@override
void dispose() {
BrowserPage._open--;
_address.dispose();
_addressFocus.dispose();
super.dispose();