Search code examples
flutterflutterwebviewplugin

How to load a web page from user input string


I'm new to learning flutter and am working on webview. I have created an application that takes in a user input string from a textfield and loads it in a webview widget when a button is pressed. But the webview widget doesn't update when the button is clicked. Here's the code:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebviewScreen extends StatefulWidget {
  const WebviewScreen({super.key});

  @override
  State<WebviewScreen> createState() => _WebviewScreenState();
}

class _WebviewScreenState extends State<WebviewScreen> {
  TextEditingController urlController = TextEditingController();
  WebViewController webController = WebViewController();
  String url = 'https://google.com';

  Future<void> buttonPressed() async {
    setState(() {
      url = urlController.text;
    });
    await webController.loadHtmlString(url);
  }

  @override
  void initState() {
    urlController.text = 'https://';
    webController.loadRequest(Uri.parse(url));
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Webview App'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            Row(
              crossAxisAlignment: CrossAxisAlignment.baseline,
              textBaseline: TextBaseline.ideographic,
              children: [
                Expanded(
                  child: Container(
                    margin: const EdgeInsets.symmetric(horizontal: 20),
                    child: TextField(
                      controller: urlController,
                      keyboardType: TextInputType.url,
                      decoration: const InputDecoration(
                        labelText: 'Enter URL',
                      ),
                    ),
                  ),
                ),
                TextButton(
                  onPressed: buttonPressed,
                  child: const Text(
                    'Go',
                    style: TextStyle(fontSize: 25),
                  ),
                ),
              ],
            ),
            const SizedBox(height: 70),
            SizedBox(
              height: 500,
              width: 350,
              child: WebViewWidget(
                controller: webController,
              ),
            )
          ],
        ),
      ),
    );
  }
}

I am running this on the iOS simulator.

webview_flutter version: 4.2.1


Solution

  • You are load html string on button click that's why not load webview its loading normal HTML string.You need to used loadRequest() instead of loadHtmlString().

    Future<void> buttonPressed() async {
        setState(() {
          url = urlController.text;
        });
        // await webController.loadHtmlString(url);    // remove this line
        await webController.loadRequest(Uri.parse(url)); // add this line
      }