flutter 没有为类型“_WebViewTabState”定义方法“_requestDownload”

fv2wmkja  于 2023-01-05  发布在  Flutter
关注(0)|答案(1)|浏览(153)
    • bounty将在7天后过期**。回答此问题可获得+50的声誉奖励。ayushkadbe正在寻找来自声誉良好来源的答案

我正在尝试使用flutter_downloader在InAppWebView中进行下载。我正在尝试使用InAppWebViewControlleronDownloadStartRequest函数从另一个文件访问flutter_downloader下载任务函数**_requestDownload**。但我收到此错误
没有为类型"_WebViewTabState"定义方法"_requestDownload"。(文档)请尝试将名称更正为现有方法的名称,或定义名为"_requestDownload"的方法。

    • 如何使用全局键从_WebViewTabState访问该方法?**

webview_tab. dart,我尝试在其中访问_requestDownload函数:

@override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: _buildWebView(),
    );
  }
InAppWebView _buildWebView() {
    var browserModel = Provider.of<BrowserModel>(context, listen: true);
    var settings = browserModel.getSettings();
    var currentWebViewModel = Provider.of<WebViewModel>(context, listen: true);

    if (Util.isAndroid()) {
      InAppWebViewController.setWebContentsDebuggingEnabled(
          settings.debuggingEnabled);
    }
    //----Other code---
    return InAppWebView(
       key: webViewTabStateKey,
      initialUrlRequest: URLRequest(url: widget.webViewModel.url),
      initialSettings: initialSettings,
      onWebViewCreated: (controller) async {//--code}

      onDownloadStartRequest: (controller, downloadStartRequest) async {
        await _requestDownload(TaskInfo()); //ERROR HERE
      },
    ),
}

downloads_page. dart,其中定义了请求下载()函数。

class _DownloadsPageState extends State<DownloadsPage> {
  List<TaskInfo>? _tasks;
  late List<ItemHolder> _items;
  late bool _showContent;
  late bool _permissionReady;
  late bool _saveInPublicStorage;
  late String _localPath;
  final ReceivePort _port = ReceivePort();
  //Isolate Code

  //Download Request
  Future<void> _requestDownload(TaskInfo task) async {
    var hasStoragePermission = await Permission.storage.isGranted;
    if (!hasStoragePermission) {
      final status = await Permission.storage.request();
      hasStoragePermission = status.isGranted;
    }
    if (hasStoragePermission) {
      task.taskId = await FlutterDownloader.enqueue(
        url: task.link!,
        headers: {'auth': 'test_for_sql_encoding'},
        savedDir: _localPath,
        saveInPublicStorage: _saveInPublicStorage,
      );
    }
  }
  @override
  Widget build(BuildContext context) {
  }
}
bvjxkvbb

bvjxkvbb1#

您似乎试图从定义Private方法的库外部调用该方法。
我们来解决这个问题!
首先从方法名中删除前缀_,该方法名应该从定义它的库外部访问。
我的意思是,与其宣称:

Future<void> _requestDownload(TaskInfo task) async {
...

如果希望能够从外部调用该方法,则必须将其定义为:

Future<void> requestDownload(TaskInfo task) async {
...

Flutter中,前缀_将一个方法声明为Private,这意味着您不能从定义它的库之外访问它!
此外,要从另一个库调用requestDownload,您必须在_DownloadsPageState之外声明它(在根级别),因为_DownloadsPageState本身是Private!

class _DownloadsPageState extends State<DownloadsPage> {
...
}

Future<void> requestDownload(TaskInfo task) async {
...
}

最后你需要导入一个文件,在这个文件中你要使用的方法是在库中定义的。所以,为了在webview_tab.dart中使用requestDownload,你需要导入downloads_page.dart
要了解更多关于此主题的信息,请访问Dart的语言教程。

相关问题