web-dev-qa-db-fra.com

Flutter: webview_flutter URL URL dans le même widget webview

Hey j'essaie de créer un écran qui affiche un webview avec un BottomAppbar. Donc, vous chargez la vision webview et lorsque vous tapotant sur un élément de l'autre site Web, un autre site Web doit être chargé dans la même webview ...

Je ne peux pas comprendre comment ouvrir un autre site Web autre que j'ai analysé. J'ai essayé de mettre à jour l'URL à l'aide de "SetState", mais il met uniquement à jour le titre AppBar et le WebView affiche toujours le site Web d'origine.

Voici mon code actuel:

class _WebviewContainer extends State<WebviewContainer> {
var url;
final key = UniqueKey();

_WebviewContainer(this.url); 

@override
Widget build(BuildContext context) {    
return Scaffold(
  appBar: AppBar(
    title: Text(url),
    actions: <Widget>[
      IconButton(
        icon: Icon(
          Icons.home,
          size: 40.0,
          color: Colors.white,
        ),
        onPressed: () => {
          //-> Here I set the new url but the webview always shows the Origin website

          setState(() {
            url = 'https://stackoverflow.com/';
          })
        },
      )
    ],
  ),
  body: Column(
    children: <Widget>[
      Expanded(
        child: WebView(
          key: key,
          javascriptMode: JavascriptMode.unrestricted,
          initialUrl: url,              
        ),
      ),          
    ],
  ),
);
}
}

J'ai pris le code d'un didacticiel sur YouTube et que le Créateur a également déclaré que la View se rechargera si l'état de l'URL change, mais malheureusement, il n'a pas montré comment le faire

Si quelqu'un pouvait m'aider?

Merci d'avance Doobie

7
DoobieAsDave

J'ai donc eu une situation similaire sauf que je voulais qu'une nouvelle URL soit chargée dans mon webview lorsque j'ai sélectionné un article d'un DropdownMenu. Comment j'ai fait cela a été créé une instance de WebviewController

WebViewController controller;

Ensuite, définissez ce contrôleur lorsque la vision Web est créée avec le paramètre OnwebviewCreated.

child: WebView(
      key: _key,
      javascriptMode: JavascriptMode.unrestricted,
      initialUrl: url,
    onWebViewCreated: (WebViewController webViewController) {
    controller = webViewController;}

Maintenant, vous avez le contrôleur défini, vous pouvez utiliser sa méthode LoadURL dans SetState () pour modifier l'URL affichée.

setState(() {                
            controller.loadUrl(newUrl_here);

Je viens de commencer avec le flutter pour pouvoir être un meilleur moyen, mais cela a fonctionné pour moi

4
nyorn

Vous pouvez également essayer mon plug-in flutter_inappwebview , qui est un plug-in flutter qui vous permet d'ajouter Inline Webviews ou d'ouvrir une fenêtre de navigateur in-app et de nombreux événements, méthodes et options permettant de contrôler Webviews.

Pour mettre à jour votre titre AppBar et ouvrez en même temps un nouveau site Web, vous pouvez simplement mettre à jour la variable url variable du widget avec la nouvelle URL, puis appelez la fonction InAppWebViewController.loadUrl(url) méthode.

Exemple complet Utilisation de votre méthode de construction:

import 'Dart:async';

import 'package:flutter/material.Dart';

import 'package:flutter_inappwebview/flutter_inappwebview.Dart';

Future main() async {
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {

  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: InAppWebViewPage()
    );
  }
}

class InAppWebViewPage extends StatefulWidget {
  @override
  _InAppWebViewPageState createState() => new _InAppWebViewPageState();
}

class _InAppWebViewPageState extends State<InAppWebViewPage> {
  InAppWebViewController webView;
  String url = "https://flutter.dev/";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(url),
          actions: <Widget>[
            IconButton(
              icon: Icon(
                Icons.home,
                size: 40.0,
                color: Colors.white,
              ),
              onPressed: () {
                url = "https://stackoverflow.com/";
                if (webView != null)
                  webView.loadUrl(url: url);
                setState(() { });
              },
            )
          ],
        ),
        body: Container(
            child: Column(children: <Widget>[
              Expanded(
                child: Container(
                  child: InAppWebView(
                    initialUrl: url,
                    initialHeaders: {},
                    initialOptions: InAppWebViewWidgetOptions(
                      inAppWebViewOptions: InAppWebViewOptions(
                        debuggingEnabled: true,
                      ),
                    ),
                    onWebViewCreated: (InAppWebViewController controller) {
                      webView = controller;
                    },
                    onLoadStart: (InAppWebViewController controller, String url) {

                    },
                    onLoadStop: (InAppWebViewController controller, String url) {
                    },
                  ),
                ),
              ),
            ]))
    );
  }
}
0
Lorenzo Pichilli