0

I need to open a local HTML file, for which I am trying to use the following code:

class HelpScreen extends StatefulWidget {
  const HelpScreen({Key? key}) : super(key: key);

  @override
  State<HelpScreen> createState() => _HelpScreenState();
}

class _HelpScreenState extends State<HelpScreen> {
WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Help')),
      body: WebView(
        initialUrl: 'about:blank',
        onWebViewCreated: (WebViewController webViewController) {
          _controller = webViewController;
          _loadHtmlFromAssets();
        },
      ),
    );
  }

  _loadHtmlFromAssets() async {
    String fileText = await rootBundle.loadString('assets/Privacy Policy.html');
    _controller.loadUrl( Uri.dataFromString(
        fileText,
        mimeType: 'text/html',
        encoding: Encoding.getByName('utf-8')
    ).toString());
  }
}

I have met it several times on the Internet. For example, here.

But when I try to use it I get an error:

Non-nullable instance field '_controller' must be initialized. (Documentation) Try adding an initializer expression, or a generative constructor that initializes it, or mark it 'late'.

_controller is highlighted in red and prevents the application from starting. How to fix it?

Sunderam Dubey
  • 1
  • 11
  • 20
  • 40
Texter
  • 95
  • 10

2 Answers2

2

As WebViewController is non-nullable, you'll need to initialize it, like at the time of declaration or in the constructor initializing formals. But I can see you are initializing at a later stage. So, it's better to use late.

Change

WebViewController _controller;

to

late WebViewController _controller;
CopsOnRoad
  • 237,138
  • 77
  • 654
  • 440
2

You need to add the late keyword since you're initializing _controller later on:

class _HelpScreenState extends State<HelpScreen> {
  late WebViewController _controller;
MendelG
  • 14,885
  • 4
  • 25
  • 52