How to prevent widgets from being shown in notification bar in flutter - flutter

I have a code here for a simple webview. It simply displays a webpage. However, the top part of the webpage is shown stacked below the notification bar(As in some of the buttons on the top part of the page). How can I prevent this?
I know I can hide the notification bar/icons, but I want to show the contents of the webview widgets below the notification bar without hiding it. I also don't want to use an app bar. Kindly help me out
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
late WebViewController controller;
#override
void initState() {
super.initState();
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
}
#override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: WebView(
initialUrl: 'https://flutter.dev',
javascriptMode: JavascriptMode.unrestricted,
)),
debugShowCheckedModeBanner: false,
);
}
}

Just wrap your webviw with SafeArea
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
WebViewController controller;
#override
void initState() {
super.initState();
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
}
#override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: WebView(
initialUrl: 'https://flutter.dev',
javascriptMode: JavascriptMode.unrestricted,
),
)),
debugShowCheckedModeBanner: false,
);
}
}
output:

Related

How to make device back button to go to the previous page in flutter webview

I have some simple code here that just displays a webpage. I want to make it so that, pressing the device back button takes you to the previous page on the webview. I tried looking for solutions online but was unable to integrate any of them into my code. Kindly help me out.
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
#override
void initState() {
super.initState();
if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
}
#override
Widget build(BuildContext context) {
return MaterialApp(
title: "Mobile App",
home: Scaffold(
body: SafeArea(
child: WebView(
initialUrl: 'https://flutter.dev',
javascriptMode: JavascriptMode.unrestricted,
))),
debugShowCheckedModeBanner: false,
);
}
}
Wrap Scaffold with this widget
WillPopScope(
onWillPop: controller.onBackPressedHandler,
child: Scaffold( ... )
Future<bool> onBackPressedHandler() {
return Future.value(false);} //return false disables default functionality
you can control back button functionality in onBackPressedHandler function.
For your case you should put this line of code inside it
webviewController.goBack();

build method of subclass that extends RouterDelegate is not rebuild when App's state changed in Flutter

When app is open,the first_screen widget must display until 3seconds and after the time passed home_page widget must show that I expect.But,after over 3seconds,home_page is not appear.State changing is notified from provider to Router.Which part is error?Please!!
My router app_route.dart is
import 'package:flutter/material.dart';
import 'package:navigator_2/keys/screen_keys.dart';
import 'package:navigator_2/provider/tab_provider.dart';
import 'package:navigator_2/root_screen.dart';
import 'package:navigator_2/screens/first_screen.dart';
class AppRoute extends RouterDelegate<AppKey> with ChangeNotifier,PopNavigatorRouterDelegateMixin{
#override
late final GlobalKey<NavigatorState> navigatorKeys;
final TabManager _tabManager;
AppRoute(this._tabManager) : navigatorKeys = GlobalKey<NavigatorState>(){
_tabManager.addListener(() {notifyListeners();});
}
#override
Widget build(BuildContext context) {
print("${_tabManager.isInitialPage}");
print("${_tabManager.currentTab}");
return Navigator(
key: navigatorKeys,
onPopPage: _handlePopPage,
pages: [
if(!_tabManager.isInitialPage) FirstScreen.page(),
if(_tabManager.isInitialPage == true)...{
RootScreen.page(_tabManager.currentTab)
},
],
);
}
#override
Future<void> setNewRoutePath(configuration) {
// TODO: implement setNewRoutePath
throw UnimplementedError();
}
bool _handlePopPage(Route<dynamic> route, result) {
if(!route.didPop(result)){
return false;
}
return true;
}
#override
// TODO: implement navigatorKey
GlobalKey<NavigatorState>? get navigatorKey => navigatorKeys;
}`
--------------------------------------------------------------------------------------------------
main.dart is
import 'package:flutter/material.dart';
import 'package:navigator_2/provider/tab_provider.dart';
import 'package:navigator_2/router_api/app_route.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
// This widget is the root of your application.
#override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late AppRoute _appRoute;
TabManager tabManager = TabManager();
#override
void initState() {
super.initState();
_appRoute = AppRoute(tabManager);
}
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => TabManager())
],
child: Router(routerDelegate: _appRoute),
),
);
}
}

How to get final url from webview flutter

I am making Downloader app which has a Webview where user can browse when there is the video playing he can download by click float button .but the problem is that it has only initial URL I want final URL to send it to my API to download that video.How to get Final Url in webview
import 'dart:html';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main(){
runApp(myapp());
}
class myapp extends StatefulWidget {
#override
_myappState createState() => _myappState();
}
final Completer<WebViewController> _controller = Completer<WebViewController>();
class _myappState extends State<myapp> {
#override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: new Text('Fb Video Downloader'),
backgroundColor: Colors.blueAccent,
),
body: Column(
children: <Widget>[
new Text(''),
WebView(
initialUrl: "https://example.com",
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webcontroller){
_controller.complete(webcontroller);
},
),
],
),
),
);
}
}`
Looking at the documentation for WebViewController it seems like it has a method called currentUrl() that probably will give you the result you're looking for.
currentUrl = await _yourWebController.currentUrl()

Flutter webview failed to fit webpage with screen

i'm using webview_flutter: ^0.3.14+1.
Webview can't load web page https://m.bilibili.com/video/av57346110.html correctly. The web page is oversized
But if I open it with chrome, the web page fits screen correctly.
And I don't understand the difference between web browser and flutter webview.
Here's minimal codes to reproduce:
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
#override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
#override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(),
body: Container(
child: WebView(
initialUrl: "https://m.bilibili.com/video/av57346110.html",
javascriptMode: JavascriptMode.unrestricted,
navigationDelegate: (NavigationRequest request) {
print("Loading... ${request.url}");
if(request.url.startsWith("http")) {
return NavigationDecision.navigate;
} else {
return NavigationDecision.prevent;
}
},
),
),
),
);
}
}
I implement this with same plugin 'webview_flutter' and it is working just fine.
Here is my code
WebView(
initialUrl: 'https://m.bilibili.com/video/av57346110.html',
javascriptMode: JavascriptMode.unrestricted,
allowsInlineMediaPlayback: true,
)

Is there any Problem in my Flutter (dart) code ? 'Local html is not showing in UI'

I am Using this library (https://github.com/pedromassango/flutter_delivery) for drawer.
and i want to show Local html content in the home (Container) Widget,and i have followed this Webview Tutorial (http://www.coderzheaven.com/2019/05/25/load-local-html-file-into-webview-in-flutter-call-js-function-from-flutter/)
But nothing Worked for me !
Thanks in Advance !
http://www.coderzheaven.com/2019/05/25/load-local-html-file-into-webview-in-flutter-call-js-function-from-flutter/
main.dart
import 'dart:convert';
import 'package:delivery/circular_image.dart';
import 'package:delivery/menu_page.dart';
import 'package:flutter/material.dart';
import 'package:delivery/zoom_scaffold.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() => runApp(new MyApp());
String filePath = '/assests/files/abc1.html';
WebViewController _webViewController;
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Zoom Menu',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
#override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
MenuController menuController;
#override
void initState() {
super.initState();
menuController = new MenuController(
vsync: this,
)..addListener(() => setState(() {}));
}
#override
void dispose() {
menuController.dispose();
super.dispose();
}
#override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => menuController,
child: ZoomScaffold(
menuScreen: MenuScreen(),
contentScreen: Layout(
contentBuilder: (cc) => Container(
color: Colors.grey[600],
child: WebView(
initialUrl: filePath,
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_webViewController = webViewController;
_loadHtmlFromAssets();
},
),
)),
),
);
}
_loadHtmlFromAssets() async {
String fileHtmlContents = await rootBundle.loadString(filePath);
_webViewController.loadUrl(Uri.dataFromString(fileHtmlContents,
mimeType: 'text/html', encoding: Encoding.getByName('utf-8'))
.toString());
}
}
pubspec.taml
name: delivery
description: A new Flutter project.
version: 1.0.0+1
environment:
sdk: ">=2.0.0-dev.68.0 <3.0.0"
dependencies:
webview_flutter: ^0.3.14+1
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
provider: ^2.0.0
dev_dependencies:
flutter_test:
sdk: flutter
# The following section is specific to Flutter.
flutter:
uses-material-design: true
# To add assets to your application, add an assets section, like this:
assets:
- assests/files/
- assests/files/abc1.html
# I want to show the local html file content but showing nothing !
# but works with widget like Text color,etc
Step 1 change /assets/files/abc1.html to assets/files/abc1.html , remove the frist /
Step 2 initialUrl: ''
full code
import 'dart:convert';
import 'package:delivery/circular_image.dart';
import 'package:delivery/menu_page.dart';
import 'package:flutter/material.dart';
import 'package:delivery/zoom_scaffold.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() => runApp(new MyApp());
String filePath = 'assets/sample.html';
WebViewController _webViewController;
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Zoom Menu',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
#override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
MenuController menuController;
#override
void initState() {
super.initState();
menuController = new MenuController(
vsync: this,
)..addListener(() => setState(() {}));
}
#override
void dispose() {
menuController.dispose();
super.dispose();
}
#override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => menuController,
child: ZoomScaffold(
menuScreen: MenuScreen(),
contentScreen: Layout(
contentBuilder: (cc) => Container(
color: Colors.grey[600],
child: WebView(
initialUrl: '',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_webViewController = webViewController;
_loadHtmlFromAssets();
},
),
)),
),
);
}
_loadHtmlFromAssets() async {
String fileHtmlContents = await rootBundle.loadString(filePath);
_webViewController.loadUrl(Uri.dataFromString(fileHtmlContents,
mimeType: 'text/html', encoding: Encoding.getByName('utf-8'))
.toString());
}
}
working demo
I think you have given your asset path wrong.
Change your asset path from
String filePath = '/assests/files/abc1.html';
To
String filePath = '/assets/files/abc1.html';