—web-port=3000
****와 같이 지정해서 빌드하도록 하자flutter run -d chrome --web-port=3000
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
usePathUrlStrategy();
import 'package:web/web.dart';
// 세션 스토리지 저장
_sessionStore({required String sessionStorage}) {
window.sessionStorage['session_value'] = sessionStorage;
}
// 쿠키 저장
_cookieStorage({required String cookies}) {
window.document.cookie =
'username=$cookies; expires=Thu, 18 Dec 2024 12:00:00 UTC';
}
// 로컬 스토리지 저장
_localStorage({required String localStorage}) {
window.localStorage['local_value'] = localStorage;
}
// 로컬 스토리지에서 특정 아이템 값을 확인해 라우트
routeByLocalStorage({required BuildContext context}) {
final String? isStorageExiest = window.localStorage.getItem('local_value');
logger.e(isStorageExiest);
if (isStorageExiest == null) {
context.goNamed(LoginScreen.route);
} else {
context.goNamed(HomeScreen.route);
}
}
window.location.reload();
- Flutter Secure Storage는 웹을 지원한다고는 되어있으나, 현재 실험적인 단계라고 한다.
await SecureStorageService.setString(key: 'new', value: '마이 네임 이스 민우');
AuthState
를 유지하는 provider를 생성하여 사용자 인증 상태를 감시하고, redirect와 연결시키려 했다.웹이 새로고침 되는 것을 감시하는 listener를 만들고, 감지될 때 마다 token을 확인하여 문제가 없으면 authState 값을 할당하자.
abstract class BrowserEvents {
///`Browser Events`
static Stream? get onBeforeUnload => html.window.onBeforeUnload;
static Stream? get onUnload => html.window.onUnload;
static Stream? get onReload => html.window.onLoad;
//Browser LocalStorage Values
static final html.Storage _localStorage = html.window.localStorage;
static bool get isWebReloaded {
String? isReloaded = _localStorage['isReload'];
if (isReloaded == null) return false;
return isReloaded == 'true';
}
static void setWebPPageReloadValue(bool value) {
_localStorage['isReload'] = value.toString().toLowerCase();
}
static void clearWebPageReloadValue() {
_localStorage.remove('isReload');
}
}
abstract class WebReloadDetector {
WebReloadDetector._();
/// Call `onBrowserReload` on Top Level Widget only Once
static void onReload(Future Function() reloadCallback) {
if (!kIsWeb) return;
WidgetsFlutterBinding.ensureInitialized();
WidgetsBinding.instance.addPostFrameCallback((_) async {
if (BrowserEvents.isWebReloaded) {
BrowserEvents.setWebPPageReloadValue(false);
await reloadCallback.call();
}
BrowserEvents.onUnload
?.listen((_) => BrowserEvents.setWebPPageReloadValue(true));
});
}
}
class _EagerInitialize extends HookConsumerWidget {
final Widget child;
const _EagerInitialize({required this.child});
Widget build(BuildContext context, WidgetRef ref) {
useEffect(
() {
WidgetsBinding.instance.addPostFrameCallback((_) {
WebReloadDetector.onReload(() async {
final bool isTokenExiest = await BrowserAuthEvent.isTokenExiest();
if (!context.mounted) return;
if (!isTokenExiest) context.goNamed(LoginScreen.route);
ref
.read(authProvider.notifier)
.setAuthState(AuthState.authenticated);
});
});
return null;
},
[],
);
return child;
}
}
https://dev.co.kr
https://qa.co.kr
localHost:3000
참조
아니 또 흘러흘러 플러터웹 검색하다 민우님글에 흘러들어와버렷네요