簡體   English   中英

'value.isInitialized': 不正確 || Flutter 桌面錯誤

[英]'value.isInitialized': is not true || Flutter desktop error

我正在為 flutter 桌面 windows 開發BlocklyBlockly 是編程語言 JavaScript 的客戶端庫,用於創建基於塊的可視化編程語言和編輯器)。 我正在使用webview_windows package 在 webview 中顯示“ https://developers.google.com/blockly ”。

下面是我的代碼

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';

import 'package:webview_windows/webview_windows.dart';

 final navigatorKey = GlobalKey<NavigatorState>();

void main() {
runApp(MyApp());
}  

 class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
   return MaterialApp(navigatorKey: navigatorKey, home: ExampleBrowser());
  }
}

 class ExampleBrowser extends StatefulWidget {
 @override
 State<ExampleBrowser> createState() => _ExampleBrowser();
}

class _ExampleBrowser extends State<ExampleBrowser> {
final _controller = WebviewController();
final _textController = TextEditingController();
 bool _isWebviewSuspended = false;

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

     Future<void> initPlatformState() async {
       try {
        await _controller.initialize();
        _controller.url.listen((url) {
         _textController.text = URL;
         });

      await _controller.setBackgroundColor(Colors.transparent);
      await _controller.setPopupWindowPolicy(WebviewPopupWindowPolicy.deny);
      await _controller.loadUrl('https://developers.google.com/blockly');

  if (!mounted) return;
  setState(() {});
} on PlatformException catch (e) {
  WidgetsBinding.instance?.addPostFrameCallback((_) {
    showDialog(
        context: context,
        builder: (_) => AlertDialog(
              title: Text('Error'),
              content: Column(
                mainAxisSize: MainAxisSize.min,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('Code: ${e.code}'),
                  Text('Message: ${e.message}'),
                ],
              ),
              actions: [
                TextButton(
                  child: Text('Continue'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                )
              ],
            ));
   });
  }
 }

 Widget compositeView() {
  if (!_controller.value.isInitialized) {
  return const Text(
    'Not Initialized',
    style: TextStyle(
      fontSize: 24.0,
      fontWeight: FontWeight.w900,
    ),
  );
} else {
  return Padding(
    padding: EdgeInsets.all(20),
    child: Column(
      children: [
        Card(
          elevation: 0,
          child: TextField(
            decoration: InputDecoration(
                hintText: 'URL',
                contentPadding: EdgeInsets.all(10.0),
                suffixIcon: IconButton(
                  icon: Icon(Icons.refresh),
                  onPressed: () {
                    _controller.reload();
                  },
                )),
            textAlignVertical: TextAlignVertical.center,
            controller: _textController,
            onSubmitted: (val) {
              _controller.loadUrl(val);
            },
          ),
        ),
        Expanded(
            child: Card(
                color: Colors.transparent,
                elevation: 0,
                clipBehavior: Clip.antiAliasWithSaveLayer,
                child: Stack(
                  children: [
                    Webview(
                      _controller,
                      permissionRequested: _onPermissionRequested,
                    ),
                    StreamBuilder<LoadingState>(
                        stream: _controller.loadingState,
                        builder: (context, snapshot) {
                          if (snapshot.hasData &&
                              snapshot.data == LoadingState.loading) {
                            return LinearProgressIndicator();
                          } else {
                            return SizedBox();
                          }
                        }),
                  ],
                ))),
      ],
    ),
    );
  }
  }

  @override
    Widget build(BuildContext context) {
    return Scaffold(
    floatingActionButton: FloatingActionButton(
    tooltip: _isWebviewSuspended ? 'Resume webview' : 'Suspend webview',
    onPressed: () async {
      if (_isWebviewSuspended) {
        await _controller.resume();
      } else {
        await _controller.suspend();
      }
      setState(() {
        _isWebviewSuspended = !_isWebviewSuspended;
      });
    },
    child: Icon(_isWebviewSuspended ? Icons.play_arrow : Icons.pause),
  ),
  appBar: AppBar(
      title: StreamBuilder<String>(
    stream: _controller.title,
    builder: (context, snapshot) {
      return Text(
          snapshot.hasData ? snapshot.data! : 'WebView (Windows) Example');
    },
  )),
    body: Center(
      child: compositeView(),
      ),
     );
  }

Future<WebviewPermissionDecision> _onPermissionRequested(
    String url, WebviewPermissionKind kind, bool isUserInitiated) async {
    final decision = await showDialog<WebviewPermissionDecision>(
    context: navigatorKey.currentContext!,
    builder: (BuildContext context) => AlertDialog(
    title: const Text('WebView permission requested'),
    content: Text('WebView has requested permission \'$kind\''),
    actions: <Widget>[
      TextButton(
        onPressed: () =>
            Navigator.pop(context, WebviewPermissionDecision.deny),
        child: const Text('Deny'),
      ),
      TextButton(
        onPressed: () =>
            Navigator.pop(context, WebviewPermissionDecision.allow),
        child: const Text('Allow'),
      ),
    ],
  ),
  );

    return decision ?? WebviewPermissionDecision.none;
  }
}

這是我在控制台中的錯誤錯誤

我在不同的場景中遇到了同樣的問題,我所做的是對Future.delayed內的其他函數執行 1 秒的 Future.delayed,在我的情況下,異常是在 setBackgroundColor 中引發的(在initialize()之后立即調用) controller 初始化后說value.isInitialized不正確,這里是一個例子:

    Future.wait([
      _windowsWebViewController.initialize(),
      _windowsWebViewController.setBackgroundColor(Colors.transparent),
      _windowsWebViewController.setPopupWindowPolicy(WebviewPopupWindowPolicy.allow),
      _windowsWebViewController.loadUrl(element.url.toString().indexOf('.pdf') != -1
          ? 'https://docs.google.com/gview?embedded=true&url=${element.url.toString()}'
          : element.url.toString()),
    ]);

這里的解決方案:

Future.wait([
      _windowsWebViewController.initialize(),
    ]);

    Future.delayed(Duration(seconds: 1), () {

      _windowsWebViewController.setBackgroundColor(Colors.transparent);
      _windowsWebViewController.setPopupWindowPolicy(WebviewPopupWindowPolicy.allow);
      _windowsWebViewController.loadUrl(element.url.toString().indexOf('.pdf') != -1
      ? 'https://docs.google.com/gview?embedded=true&url=${element.url.toString()}'
          : element.url.toString());

    });

出於某種原因,即使我們初始化了 controller,其中的方法的 rest 也沒有收到關於 controller 中的值的通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM