【问题标题】:'value.isInitialized': is not true || Flutter desktop error\'value.isInitialized\': 不正确 ||颤振桌面错误
【发布时间】:2022-08-11 03:24:37
【问题描述】:

我正在努力块状(Blockly 是 JavaScript 编程语言的客户端库,用于创建基于块的可视化编程语言和编辑器) 用于颤振的桌面窗口。 我正在使用 webview_windows 包在 web 视图中显示 \'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;
  }
}

这是我在控制台中的错误

    标签: flutter flutter-layout flutter-desktop blockly google-blockly


    【解决方案1】:

    我在不同的场景中遇到了同样的问题,我所做的是对控制器内的其他函数执行 1 秒的 Future.delayed,在我的情况下,异常是在 setBackgroundColor 中引发的(在 initialize() 之后立即调用)在控制器初始化后说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());
    
        });
    

    出于某种原因,即使我们初始化了控制器,即使我们使用 await 来完成初始化,它内部的其余方法也不会立即得到通知。

    【讨论】:

      猜你喜欢
      • 2022-06-14
      • 2020-12-09
      • 2019-11-05
      • 2019-03-12
      • 2021-12-24
      • 2022-01-09
      • 2020-08-20
      • 2021-07-04
      • 2021-12-11
      相关资源
      最近更新 更多