web-dev-qa-db-ja.com

Dart / Flutterで別のファイルの機能を使用するには?

Flutter_web_viewパッケージを使用しているFlutterアプリがあります。私はそれをいくつかの異なるファイルで使用していますが、それを機能させるために必要なコードの行がいくつかあるので、独自のファイルを作成し、アプリの任意の場所で_launchwebview関数を参照するだけです。ファイルを参照して情報を渡す方法は知っていますが、メソッド/関数は知りません。ここにクラスコードがあります...

import 'package:flutter/material.Dart';
import 'package:flutter_web_view/flutter_web_view.Dart';

class ShopClass extends StatefulWidget {
  @override
  ShopClassState createState() => new ShopClassState();
}

class ShopClassState extends State<ShopClass> {
  String _redirectedToUrl;
  FlutterWebView flutterWebView = new FlutterWebView();
  bool _isLoading = false;

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

  @override
  Widget build(BuildContext context) {
    Widget leading;
    if (_isLoading) {
      leading = new CircularProgressIndicator();
    }
    var columnItems = <Widget>[
      new MaterialButton(
          onPressed: launchWebViewExample, child: new Text("Launch"))
    ];
    if (_redirectedToUrl != null) {
      columnItems.add(new Text("Redirected to $_redirectedToUrl"));
    }
    var app = new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          leading: leading,
        ),
        body: new Column(
          children: columnItems,
        ),
      ),
    );
    return app;
  }


  void launchWebViewExample() {
    if (flutterWebView.isLaunched) {
      return;
    }

    flutterWebView.launch("https://apptreesoftware.com",
        headers: {
          "X-SOME-HEADER": "MyCustomHeader",
        },
        javaScriptEnabled: false,
        toolbarActions: [
          new ToolbarAction("Dismiss", 1),
          new ToolbarAction("Reload", 2)
        ],
        barColor: Colors.green,
        tintColor: Colors.white);
    flutterWebView.onToolbarAction.listen((identifier) {
      switch (identifier) {
        case 1:
          flutterWebView.dismiss();
          break;
        case 2:
          reload();
          break;
      }
    });
    flutterWebView.listenForRedirect("mobile://test.com", true);

    flutterWebView.onWebViewDidStartLoading.listen((url) {
      setState(() => _isLoading = true);
    });
    flutterWebView.onWebViewDidLoad.listen((url) {
      setState(() => _isLoading = false);
    });
    flutterWebView.onRedirect.listen((url) {
      flutterWebView.dismiss();
      setState(() => _redirectedToUrl = url);
    });
  }



  void reload() {
    flutterWebView.load(
      "https://google.com",
      headers: {
        "X-SOME-HEADER": "MyCustomHeader",
      },
    );
  }
}

別のクラスでlaunchWebViewExampleを使用するにはどうすればよいですか?

20
Charles Jr

次のように、その機能だけでファイルを作成できます。

test.Dart

void launchWebView () {
  print("1234");
}

次に、このファイルを次のようにインポートします。

main.Dart

import "test.Dart";

class _MyHomePageState extends State<MyHomePage> {
   @override
   Widget build(BuildContext context) {
       launchWebView();

それは本当にきれいではありませんが、あなたはそれを行うことができます。または、次のような静的メソッドでクラスを使用できます。

class test {
    static void foo() {
        print("1234");
    }
}

そして、あなたのコードでそのように呼び出します(インポート後):

test.foo();
35
Antonino Cacace

または、クラス内ですべての関数(ヘルパー)を宣言し、それらを引数として他のクラスに渡すことができます。

//The class which contains your functions
class HelperFunction{

  //Define your method
  void launchWebView () {
    print("1234");
  }

  //Pass that function to a class
  MyHomePage(launchWebView);

}

//The class which receives the function.
class MyHomePage extends StatefulWidget{
  //Retrieve the function and store it to a variable of type Function.
  final Function launchWebView;
  MyHomePage(this.launchWebView);
}

class class _MyHomePageState extends State<MyHomePage> {
   @override
   Widget build(BuildContext context) {
     //Access that function in State class using widget keyword.
     widget.launchWebView();
   }
}  
4
terap30

クラスレベルで関数を宣言したい

ファイルfoo.Dart

class foo {

  void launchWebView () {};

}

ファイルbar.Dart

import 'foo.Dart'
class Bar {

  void someFunction (){
    launchWebView();
  }


}
1
Tree