Flutter & Python

This example shows how to run python script from flutter.

This example is based on starcore_for_flutter, which enables flutter calls other scripts.

Step by Step

1. Create flutter project

$ flutter create flutter_python

2. Add dependency package “starflut” and assets folder

Edit “pubspec.yaml”

dependencies:
  flutter:
    sdk: flutter

  starflut: any
  
  ...
  
  # To add assets to your application, add an assets section, like this:
  assets:
    - starfiles/  

3. Create “starfiles” folder at project root, and add file “python3.6.zip”

4. Create “assets” and “jniLibs”, and add python share libraries for android

5. dart code

  • Initialize starcore
StarCoreFactory starcore = await Starflut.getFactory();
StarServiceClass Service = await starcore.initSimple("test", "123", 0, 0, []);
  • Register callback function
    await starcore.regMsgCallBackP(
        (int serviceGroupID, int uMsg, Object wParam, Object lParam) async{
          if( uMsg == Starflut.MSG_DISPMSG || uMsg == Starflut.MSG_DISPLUAMSG ){
            ShowOutput(wParam);
          }
      print("$serviceGroupID  $uMsg   $wParam   $lParam");
      return null;
    });

In callback function, we capture the output from python, and show it in text window.

  void ShowOutput(String Info) async{
    if( Info == null || Info.length == 0)
      return;
    _outputString = _outputString + "\n" + Info;
    setState((){

    });
  }
  • Initialize python

for android, before run python, share libraries must be copied to app’s local folder.

    bool isAndroid = await Starflut.isAndroid();
    if( isAndroid == true ){
      String libraryDir = await Starflut.getNativeLibraryDir();
      String docPath = await Starflut.getDocumentPath();
      if( libraryDir.indexOf("arm64") > 0 ){
        Starflut.unzipFromAssets("lib-dynload-arm64.zip", docPath, true);
      }else if( libraryDir.indexOf("x86_64") > 0 ){
        Starflut.unzipFromAssets("lib-dynload-x86_64.zip", docPath, true);
      }else if( libraryDir.indexOf("arm") > 0 ){
        Starflut.unzipFromAssets("lib-dynload-armeabi.zip", docPath, true);
      }else{  //x86
        Starflut.unzipFromAssets("lib-dynload-x86.zip", docPath, true);
      }
      await Starflut.copyFileFromAssets("python3.6.zip", "flutter_assets/starfiles",null);  //desRelatePath must be null 
    }

Initialize python

    if( await srvGroup.initRaw("python36", Service) == true ){
      _outputString = "init starcore and python 3.6 successfully";
      _isButtonDisabled = false;
    }else{
      _outputString = "init starcore and python 3.6 failed";
    }
  • Input and run python scrript
  void runScriptCode() async{
    if( myController.text.length == 0 )
      return;
    await srvGroup.runScript("python", myController.text, null);

    setState((){

    });
  }

6. compile for ios

$ flutter clean
$ export STARCORE_PATH='/Users/srplab/Desktop'
$ export STARCORE_PYTHONVERSION='3.6'
$ export STARCORE_PYTHONLIBRARY='star_python36,python3.6m'
$ flutter build ios --no-codesign

7. screenshot

Sample Download

flutter_and_python_sample.zip