A convenience wrapper for building Flutter apps with PDFTron mobile SDK.

Overview

About PDFTron Flutter

PDFTron's Flutter PDF library brings smooth, flexible, and stand-alone document viewing and editing solutions using Flutter codebases for iOS and Android applications.

  • Direct MS Office document viewing and conversion
  • Fully customizable open source UI to improve app engagement
  • Document reflow to increase readability and accessibility on mobile
  • File streaming to view remote and complex documents faster
  • Night mode to improve viewing in low-light environments
  • And much more...

More information can be found at https://www.pdftron.com/documentation/guides/flutter

Android iOS
A gif showcasing the UI and some features on Android A gif showcasing the UI and some features on iOS

Contents

API

APIs are available on the API page.

Prerequisites

  • No license key is required for trial. However, a valid commercial license key is required after trial.
  • PDFTron SDK >= 6.9.0
  • Flutter >= 1.0.0

Null Safety

Dart now supports sound null safety, which is available starting from Dart 2.12.0 and Flutter 2.0.0.

Upgrading may cause breaking changes, so if you are not ready to change versions, continue using PDFTron Flutter SDK as you have been.

If you would like to use our null safe SDK, it is available in the following places:

Legacy UI

Version 0.0.6 is the last stable release for the legacy UI.

The release can be found here: https://github.com/PDFTron/pdftron-flutter/releases/tag/legacy-ui.

Installation

If you want to use the null safe version of our SDK (see Null Safety), please follow the installation instructions for our null safe SDK.

If you have not migrated to null safety yet, continue below.

The complete installation and API guides can be found at https://www.pdftron.com/documentation/android/flutter.

Android

The following instructions are only applicable to Android development; click here for the iOS counterpart.

  1. First follow the Flutter getting started guides to install, set up an editor, and create a Flutter Project. The rest of this guide assumes your project is created by running flutter create myapp.

  2. Add the following dependency to your Flutter project in myapp/pubspec.yaml:

    dependencies:
       flutter:
         sdk: flutter
    +  pdftron_flutter:
    +    git:
    +      url: git://github.com/PDFTron/pdftron-flutter.git
  3. Now add the following items in your myapp/android/app/build.gradle file:

    android {
        compileSdkVersion 29
    
        lintOptions {
    	disable 'InvalidPackage'
        }
    
        defaultConfig {
    	applicationId "com.example.myapp"
    -       minSdkVersion 16
    +       minSdkVersion 21
    	targetSdkVersion 29
    +       multiDexEnabled true
    +       manifestPlaceholders = [pdftronLicenseKey:PDFTRON_LICENSE_KEY]
    	versionCode flutterVersionCode.toInteger()
    	versionName flutterVersionName
    	testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    	...
    }
  4. In your myapp/android/gradle.properties file. Add the following line to it:

    # Add the PDFTRON_LICENSE_KEY variable here. 
    # For trial purposes leave it blank.
    # For production add a valid commercial license key.
    PDFTRON_LICENSE_KEY=
  5. In your myapp/android/app/src/main/AndroidManifest.xml file, add the following lines to the <application> tag:

    ...
    <application
    	android:name="io.flutter.app.FlutterApplication"
    	android:label="myapp"
    	android:icon="@mipmap/ic_launcher"
    +	android:largeHeap="true"
    +	android:usesCleartextTraffic="true">
    
        	<!-- Add license key in meta-data tag here. This should be inside the application tag. -->
    +	<meta-data
    +		android:name="pdftron_license_key"
    +		android:value="${pdftronLicenseKey}"/>
    ...

    Additionally, add the required permissions for your app in the <manifest> tag:

    	...
    +	<uses-permission android:name="android.permission.INTERNET" />
    	<!-- Required to read and write documents from device storage -->
    +	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    	<!-- Required if you want to record audio annotations -->
    +	<uses-permission android:name="android.permission.RECORD_AUDIO" />
    	...

5a. If you are using the DocumentView widget, change the parent class of your MainActivity file (either Kotlin or Java) to FlutterFragmentActivity:

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity : FlutterFragmentActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}
  1. Follow the instructions outlined in the Usage section.
  2. Check that your Android device is running by running the command flutter devices. If none are available, follow the device set up instructions in the Install guides for your platform.
  3. Run the app with the command flutter run.

iOS

The following instructions are only applicable to iOS development; click here for the Android counterpart.

  1. First, follow the official getting started guide on installation, setting up an editor, and create a Flutter project, the following steps will assume your app is created through flutter create myapp

  2. Open myapp folder in a text editor. Then open myapp/pubspec.yaml file, add:

    dependencies:
       flutter:
         sdk: flutter
    +  pdftron_flutter:
    +    git:
    +      url: git://github.com/PDFTron/pdftron-flutter.git
  3. Run flutter packages get

  4. Open myapp/ios/Podfile, add:

     # Uncomment this line to define a global platform for your project
    -# platform :ios, '9.0'
    +platform :ios, '10.0'
    ...
     target 'Runner' do
       ...
    +  # PDFTron Pods
    +  use_frameworks!
    +  pod 'PDFNet', podspec: 'https://www.pdftron.com/downloads/ios/cocoapods/xcframeworks/pdfnet/latest.podspec'
     end
  5. Run flutter build ios --no-codesign to ensure integration process is successful

  6. Follow the instructions outlined in the Usage section.

  7. Run flutter emulators --launch apple_ios_simulator

  8. Run flutter run

Widget or Plugin

There are 2 different ways to use PDFTron Flutter API:

  • Present a document via a plugin.
  • Show a PDFTron document view via a Widget.

You must choose either the widget or plugin, and use it for all APIs. Mixing widget and plugin APIs will not function correctly. Whether you choose the widget or plugin is personal preference.

If you pick the Android widget, you will need to add padding for operating system intrusions like the status bar at the top of the device. One way is to set the enabled system UI, and then wrap the widget in a SafeArea or use an AppBar:

// If using Flutter v2.3.0-17.0.pre or earlier.
SystemChrome.setEnabledSystemUIOverlays(
  SystemUiOverlay.values
);
// If using later Flutter versions.
SystemChrome.setEnabledSystemUIMode(
  SystemUiMode.edgeToEdge,
);

// If using SafeArea:
return SafeArea (
  child: DocumentView(
    onCreated: _onDocumentViewCreated,
  ));

// If using AppBar:
return Scaffold(
  appBar: AppBar( toolbarHeight: 0 ),
  body: DocumentView(
    onCreated: _onDocumentViewCreated,
  ));

Usage

  1. If you want to use local files on Android, add the following dependency to myapp/pubspec.yaml:
  permission_handler: ^8.1.1
  1. Open lib/main.dart, replace the entire file with the following:
import 'dart:async';
import 'dart:io' show Platform;

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:pdftron_flutter/pdftron_flutter.dart';
// Uncomment this if you are using local files
// import 'package:permission_handler/permission_handler.dart';

void main() => runApp(MyApp());

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

class Viewer extends StatefulWidget {
  @override
  _ViewerState createState() => _ViewerState();
}

class _ViewerState extends State<Viewer> {
  String _version = 'Unknown';
  String _document =
      "https://pdftron.s3.amazonaws.com/downloads/pl/PDFTRON_mobile_about.pdf";
  bool _showViewer = true;

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

    showViewer();

    // If you are using local files delete the line above, change the _document field
    // appropriately and uncomment the section below.
    // if (Platform.isIOS) {
      // // Open the document for iOS, no need for permission.
      // showViewer();
    // } else {
      // // Request permission for Android before opening document.
      // launchWithPermission();
    // }
  }

  // Future<void> launchWithPermission() async {
  //  PermissionStatus permission = await Permission.storage.request();
  //  if (permission.isGranted) {
  //    showViewer();
  //  }
  // }

  // Platform messages are asynchronous, so initialize in an async method.
  Future<void> initPlatformState() async {
    String version;
    // Platform messages may fail, so use a try/catch PlatformException.
    try {
      // Initializes the PDFTron SDK, it must be called before you can use any functionality.
      PdftronFlutter.initialize("your_pdftron_license_key");

      version = await PdftronFlutter.version;
    } on PlatformException {
      version = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, you want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _version = version;
    });
  }

  void showViewer() async {
    // opening without a config file will have all functionality enabled.
    // await PdftronFlutter.openDocument(_document);

    var config = Config();
    // How to disable functionality:
    //      config.disabledElements = [Buttons.shareButton, Buttons.searchButton];
    //      config.disabledTools = [Tools.annotationCreateLine, Tools.annotationCreateRectangle];
    // Other viewer configurations:
    //      config.multiTabEnabled = true;
    //      config.customHeaders = {'headerName': 'headerValue'};

    // An event listener for document loading
    var documentLoadedCancel = startDocumentLoadedListener((filePath) {
      print("document loaded: $filePath");
    });

    await PdftronFlutter.openDocument(_document, config: config);

    try {
      // The imported command is in XFDF format and tells whether to add, modify or delete annotations in the current document.
      PdftronFlutter.importAnnotationCommand(
          "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
              "    <xfdf xmlns=\"http://ns.adobe.com/xfdf/\" xml:space=\"preserve\">\n" +
              "      <add>\n" +
              "        <square style=\"solid\" width=\"5\" color=\"#E44234\" opacity=\"1\" creationdate=\"D:20200619203211Z\" flags=\"print\" date=\"D:20200619203211Z\" name=\"c684da06-12d2-4ccd-9361-0a1bf2e089e3\" page=\"1\" rect=\"113.312,277.056,235.43,350.173\" title=\"\" />\n" +
              "      </add>\n" +
              "      <modify />\n" +
              "      <delete />\n" +
              "      <pdf-info import-version=\"3\" version=\"2\" xmlns=\"http://www.pdftron.com/pdfinfo\" />\n" +
              "    </xfdf>");
    } on PlatformException catch (e) {
      print("Failed to importAnnotationCommand '${e.message}'.");
    }

    try {
      // Adds a bookmark into the document.
      PdftronFlutter.importBookmarkJson('{"0":"Page 1"}');
    } on PlatformException catch (e) {
      print("Failed to importBookmarkJson '${e.message}'.");
    }

    // An event listener for when local annotation changes are committed to the document.
    // xfdfCommand is the XFDF Command of the annotation that was last changed.
    var annotCancel = startExportAnnotationCommandListener((xfdfCommand) {
      String command = xfdfCommand;
      print("flutter xfdfCommand:\n");
      // Dart limits how many characters are printed onto the console. 
      // The code below ensures that all of the XFDF command is printed.
      if (command.length > 1024) {
        int start = 0;
        int end = 1023;
        while (end < command.length) {
          print(command.substring(start, end) + "\n");
          start += 1024;
          end += 1024;
        }
        print(command.substring(start));
      } else {
        print("flutter xfdfCommand:\n $command");
      }
    });

    // An event listener for when local bookmark changes are committed to the document.
    // bookmarkJson is JSON string containing all the bookmarks that exist when the change was made.
    var bookmarkCancel = startExportBookmarkListener((bookmarkJson) {
      print("flutter bookmark: $bookmarkJson");
    });

    var path = await PdftronFlutter.saveDocument();
    print("flutter save: $path");

    // To cancel event:
    // annotCancel();
    // bookmarkCancel();
    // documentLoadedCancel();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        width: double.infinity,
        height: double.infinity,
        child:
            // Uncomment this to use Widget version of the viewer.
            // _showViewer
            // ? DocumentView(
            //     onCreated: _onDocumentViewCreated,
            //   ):
            Container(),
      ),
    );
  }

  // This function is used to control the DocumentView widget after it has been created.
  // The widget will not work without a void Function(DocumentViewController controller) being passed to it.
  void _onDocumentViewCreated(DocumentViewController controller) async {
    Config config = new Config();

    var leadingNavCancel = startLeadingNavButtonPressedListener(() {
      // Uncomment this to quit the viewer when leading navigation button is pressed.
      // this.setState(() {
      //   _showViewer = !_showViewer;
      // });

      // Show a dialog when leading navigation button is pressed.
      _showMyDialog();
    });

    controller.openDocument(_document, config: config);
  }

  Future<void> _showMyDialog() async {
    print('hello');
    return showDialog<void>(
      context: context,
      barrierDismissible: false, // User must tap button!
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('AlertDialog'),
          content: SingleChildScrollView(
            child: Text('Leading navigation button has been pressed.'),
          ),
          actions: <Widget>[
            TextButton(
              child: Text('OK'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }
}

Contributing

See Contributing

License

See License

Comments
  • Pdftron Direct MS Office document viewing and conversion

    Pdftron Direct MS Office document viewing and conversion

    Hey, I am using pdftron in my project . I want to add conversion features in my app like pdf to doc and vice versa, but I am unable to find anything related to that in the documentation.

    opened by adiShinwari 11
  • Web/mobile annotations missmatch

    Web/mobile annotations missmatch

    Describe the bug Imported annotations mismatch for web and mobile for .jpg files.

    Steps to Reproduce the Problem

    1. Open a .jpg document in either mobile or web viewer/annotator;
    2. add some annotation;
    3. close the viewer/annotator;
    4. open the document on both web and mobile and import the annotations;
    5. the annotations mismatch.

    Expected behavior The annotations are supposed to be consistent on web and mobile, regardless of the file extension.

    Screenshots Екранна снимка 2020-12-01 133720

    Platform/Device Information (please complete the following information if applicable):

    • Platform: Android
    • Device: Nexus 5X
    • OS: Andoid

    Additional context Mobile SDK version: resolved-ref: "120c3df3977b82258962651212a04bbde1859126" url: "git://github.com/PDFTron/pdftron-flutter.git" version: "0.0.2"

    Web viewer version: 7.1.2

    bug android 
    opened by bbozhidarov 9
  • Exporting List of Annotations That Were Imported Fails

    Exporting List of Annotations That Were Imported Fails

    Describe the bug In my application, a user needs to be able to add annotations to a document, save them, then modify/add more annotations to the document later. Devices can be shared between users, but the annotations are user specific, so they can't be saved to the document itself. Instead, the annotations are exported and saved to the app's local DB, and the next time the user opens the document, we grab the annotations and import them. When the annotations are imported, we parse the xml so we can grab the ID and page number of the annotations that were imported. This information is needed so that we don't lose pre-existing annotations the next time an export is performed. However, when I call exportAnnotations and pass in a list of annotations, any of the annotations that were imported in are not grabbed. If I call exportAnnotations and don't pass in a list, the annotations that were imported are grabbed correctly. Between looking at the exported string when exporting all annotations and the values passed into the startAnnotationChangedListener when I modify one of the imported annotations, I have confirmed that the ID's and page numbers in the list I'm using are correct.

    Steps to Reproduce the Problem

    1. Open a document
    2. Add any number of annotations (keeping track of the annotations that are added)
    3. Call exportAnnotations and pass in the list of added annotations to get the string value and store the string in persistent storage
    4. Close the document and re-open it
    5. Grab the saved annotation string and import it into the document
    6. Save the ID and page number from each imported annotation into an Annot object and keep those objects in a list
    7. Add another annotation to the document, and add the created Annot object to the list where you are storing the imported annotations (the bug exists whether you add a new annotation or not, but this is the primary use case)
    8. Call exportAnnotations again, passing in the list of imported and new annotations as a parameter
    9. Any annotations that were imported when the document first loaded are not captured in the string returned from exportAnnotations

    Expected behavior As long as the ID and the page number are correct on the Annot objects in the list being passed into the exportAnnotation method, I would expect the object's information to be captured in the string returned from the exportAnnotation method.

    Screenshots

    The first time I call exportAnnotations passing in my list with one new annotation: image

    The second time I call exportAnnotations, this time the list contains the imported annotation and a new annotation: image

    Platform/Device Information (please complete the following information if applicable):

    • Platform: iOS (not tested on Android)
    • Device: iPhone 12 Pro Max
    • OS: iOS 15

    Additional context If I modify an imported annotation, grab the Annot object passed into the startAnnotationChangedListener, and then try to export that Annot object, it does appear to be exported correctly. I have confirmed the ID is the same as the object I am creating from the import, so it seems like the export is looking for a matching object rather than a matching ID. If there was a way to grab the Annot object from the DocumentViewController using the Annot ID, I would be happy to do that, but I did not see a way to do that.

    bug 
    opened by EthanBXorbix 8
  • Add ability to add custom buttons to application navigation bar

    Add ability to add custom buttons to application navigation bar

    To test:

    in main.dart if in widget mode

    iOS:

    void _onDocumentViewCreated(DocumentViewController controller) async {
       Config config = new Config();
    
       var leadingNavCancel = startLeadingNavButtonPressedListener(() {
         // Uncomment this to quit viewer when leading navigation button is pressed:
         // this.setState(() {
         //   _showViewer = !_showViewer;
         // });
    
         // Show a dialog when leading navigation button is pressed.
         _showMyDialog();
       });
       config.topAppNavBarRightBar = [Buttons.moreItemsButton, CustomToolbarItem('20', 'testNAME', 'pencil.circle'), CustomToolbarItem('21', 'testNAME2', 'pencil.circle'), CustomToolbarItem('22', 'testNAME3', 'pencil.circle'), CustomToolbarItem('23', 'testNAME4', 'pencil.circle')];
       await controller.openDocument(_document, config: config);
     }
    
    image

    Android:

      void _onDocumentViewCreated(DocumentViewController controller) async {
        Config config = new Config();
    
        var leadingNavCancel = startLeadingNavButtonPressedListener(() {
          // Uncomment this to quit viewer when leading navigation button is pressed:
          // this.setState(() {
          //   _showViewer = !_showViewer;
          // });
    
          // Show a dialog when leading navigation button is pressed.
          _showMyDialog();
        });
        config.topAppNavBarRightBar = [CustomToolbarItem('20', 'testNAME', 'ic_lock'), CustomToolbarItem('21', 'testNAME2', 'ic_mode_edit_white'), CustomToolbarItem('22', 'testNAME3', 'ic_view'), CustomToolbarItem('23', 'testNAME4', 'ic_view'), CustomToolbarItem('24', 'testNAME5', 'ic_view')];
        await controller.openDocument(_document, config: config);
      }
    
    image image enhancement ios android 
    opened by darrenchann 6
  • Customize UI of pdftron

    Customize UI of pdftron

    hello, can I change the default UI of pdftron? I am creating an application where I want to add my own icons and buttons etc instead of the default ones from SDK. so how can I achieve that?

    opened by adiShinwari 6
  • fillAndSign on iOS

    fillAndSign on iOS

    Hi,

    I am trying to customize the pdf view and hide some no-needed tools. All the tools can be hidden except fillAndSign.

    var hideDefaultAnnotationToolbars = [ DefaultToolbars.fillAndSign ]; config.hideDefaultAnnotationToolbars = hideDefaultAnnotationToolbars;

    BR

    opened by Moussabaddour 6
  • App can't compile due to NullPointerException

    App can't compile due to NullPointerException

    1. Clone the example project for pdftron from the below link : https://github.com/PDFTron/pdftron-flutter/tree/master/example. Tried compiling the above project.

    Expected results: Should be able to view the pdf document provided in the example.

    Actual results: FAILURE: Build failed with an exception.

    Error in Console: E/MethodChannel#pdftron_flutter(26254): Failed to handle method call E/MethodChannel#pdftron_flutter(26254): java.lang.NullPointerException E/MethodChannel#pdftron_flutter(26254): at java.util.Objects.requireNonNull(Objects.java:203) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.checkFunctionPrecondition(PluginUtils.java:3300) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.onMethodCall(PluginUtils.java:1950) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginMethodCallHandler.onMethodCall(PluginMethodCallHandler.java:276) E/MethodChannel#pdftron_flutter(26254): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/MethodChannel#pdftron_flutter(26254): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/MethodChannel#pdftron_flutter(26254): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/MethodChannel#pdftron_flutter(26254): at android.os.MessageQueue.nativePollOnce(Native Method) E/MethodChannel#pdftron_flutter(26254): at android.os.MessageQueue.next(MessageQueue.java:326) E/MethodChannel#pdftron_flutter(26254): at android.os.Looper.loop(Looper.java:160) E/MethodChannel#pdftron_flutter(26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/MethodChannel#pdftron_flutter(26254): at java.lang.reflect.Method.invoke(Native Method) E/MethodChannel#pdftron_flutter(26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/MethodChannel#pdftron_flutter(26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) E/MethodChannel#pdftron_flutter(26254): Failed to handle method call E/MethodChannel#pdftron_flutter(26254): java.lang.NullPointerException E/MethodChannel#pdftron_flutter(26254): at java.util.Objects.requireNonNull(Objects.java:203) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.checkFunctionPrecondition(PluginUtils.java:3300) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.onMethodCall(PluginUtils.java:1961) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginMethodCallHandler.onMethodCall(PluginMethodCallHandler.java:276) E/MethodChannel#pdftron_flutter(26254): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/MethodChannel#pdftron_flutter(26254): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/MethodChannel#pdftron_flutter(26254): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/MethodChannel#pdftron_flutter(26254): at android.os.MessageQueue.nativePollOnce(Native Method) E/MethodChannel#pdftron_flutter(26254): at android.os.MessageQueue.next(MessageQueue.java:326) E/MethodChannel#pdftron_flutter(26254): at android.os.Looper.loop(Looper.java:160) E/MethodChannel#pdftron_flutter(26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/MethodChannel#pdftron_flutter(26254): at java.lang.reflect.Method.invoke(Native Method) E/MethodChannel#pdftron_flutter(26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/MethodChannel#pdftron_flutter(26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) E/MethodChannel#pdftron_flutter(26254): Failed to handle method call E/MethodChannel#pdftron_flutter(26254): java.lang.NullPointerException E/MethodChannel#pdftron_flutter(26254): at java.util.Objects.requireNonNull(Objects.java:203) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.checkFunctionPrecondition(PluginUtils.java:3300) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.onMethodCall(PluginUtils.java:1972) E/MethodChannel#pdftron_flutter(26254): at com.pdftron.pdftronflutter.helpers.PluginMethodCallHandler.onMethodCall(PluginMethodCallHandler.java:276) E/MethodChannel#pdftron_flutter(26254): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/MethodChannel#pdftron_flutter(26254): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/MethodChannel#pdftron_flutter(26254): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/MethodChannel#pdftron_flutter(26254): at android.os.MessageQueue.nativePollOnce(Native Method) E/MethodChannel#pdftron_flutter(26254): at android.os.MessageQueue.next(MessageQueue.java:326) E/MethodChannel#pdftron_flutter(26254): at android.os.Looper.loop(Looper.java:160) E/MethodChannel#pdftron_flutter(26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/MethodChannel#pdftron_flutter(26254): at java.lang.reflect.Method.invoke(Native Method) E/MethodChannel#pdftron_flutter(26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/MethodChannel#pdftron_flutter(26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) D/EGL_emulation(26254): eglMakeCurrent: 0xe1005b40: ver 2 0 (tinfo 0xe1003ea0) D/EGL_emulation(26254): eglMakeCurrent: 0xe1005b40: ver 2 0 (tinfo 0xe1003ea0) D/EGL_emulation(26254): eglMakeCurrent: 0xe1005b40: ver 2 0 (tinfo 0xe1003ea0) D/EGL_emulation(26254): eglMakeCurrent: 0xe1005b40: ver 2 0 (tinfo 0xe1003ea0) D/EGL_emulation(26254): eglMakeCurrent: 0xdf773660: ver 2 0 (tinfo 0xcdbe4ae0) E/flutter (26254): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(error, null, null, java.lang.NullPointerException E/flutter (26254): at java.util.Objects.requireNonNull(Objects.java:203) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.checkFunctionPrecondition(PluginUtils.java:3300) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.onMethodCall(PluginUtils.java:1950) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginMethodCallHandler.onMethodCall(PluginMethodCallHandler.java:276) E/flutter (26254): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/flutter (26254): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/flutter (26254): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/flutter (26254): at android.os.MessageQueue.nativePollOnce(Native Method) E/flutter (26254): at android.os.MessageQueue.next(MessageQueue.java:326) E/flutter (26254): at android.os.Looper.loop(Looper.java:160) E/flutter (26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/flutter (26254): at java.lang.reflect.Method.invoke(Native Method) E/flutter (26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/flutter (26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) E/flutter (26254): ) E/flutter (26254): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7) E/flutter (26254): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18) E/flutter (26254): E/flutter (26254): E/flutter (26254): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(error, null, null, java.lang.NullPointerException E/flutter (26254): at java.util.Objects.requireNonNull(Objects.java:203) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.checkFunctionPrecondition(PluginUtils.java:3300) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.onMethodCall(PluginUtils.java:1961) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginMethodCallHandler.onMethodCall(PluginMethodCallHandler.java:276) E/flutter (26254): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/flutter (26254): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/flutter (26254): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/flutter (26254): at android.os.MessageQueue.nativePollOnce(Native Method) E/flutter (26254): at android.os.MessageQueue.next(MessageQueue.java:326) E/flutter (26254): at android.os.Looper.loop(Looper.java:160) E/flutter (26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/flutter (26254): at java.lang.reflect.Method.invoke(Native Method) E/flutter (26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/flutter (26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) E/flutter (26254): ) E/flutter (26254): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7) E/flutter (26254): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18) E/flutter (26254): E/flutter (26254): E/flutter (26254): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(error, null, null, java.lang.NullPointerException E/flutter (26254): at java.util.Objects.requireNonNull(Objects.java:203) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.checkFunctionPrecondition(PluginUtils.java:3300) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginUtils.onMethodCall(PluginUtils.java:1972) E/flutter (26254): at com.pdftron.pdftronflutter.helpers.PluginMethodCallHandler.onMethodCall(PluginMethodCallHandler.java:276) E/flutter (26254): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/flutter (26254): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/flutter (26254): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/flutter (26254): at android.os.MessageQueue.nativePollOnce(Native Method) E/flutter (26254): at android.os.MessageQueue.next(MessageQueue.java:326) E/flutter (26254): at android.os.Looper.loop(Looper.java:160) E/flutter (26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/flutter (26254): at java.lang.reflect.Method.invoke(Native Method) E/flutter (26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/flutter (26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) E/flutter (26254): ) E/flutter (26254): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7) E/flutter (26254): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18) E/flutter (26254): E/flutter (26254): #2 _ViewerState.showViewer (package:pdftron_flutter_example/main.dart:149:16) E/flutter (26254): E/flutter (26254): D/EGL_emulation(26254): eglMakeCurrent: 0xdf773660: ver 2 0 (tinfo 0xcdbe4ae0) D/EGL_emulation(26254): eglMakeCurrent: 0xe1005b40: ver 2 0 (tinfo 0xe1003ea0) D/EGL_emulation(26254): eglMakeCurrent: 0xe1005b40: ver 2 0 (tinfo 0xe1003ea0) E/WindowManager(26254): E/WindowManager(26254): android.view.WindowLeaked: Activity com.pdftron.pdftronflutter.FlutterDocumentActivity has leaked window DecorView@71affe6[FlutterDocumentActivity] that was originally added here E/WindowManager(26254): at android.view.ViewRootImpl.(ViewRootImpl.java:511) E/WindowManager(26254): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346) E/WindowManager(26254): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) E/WindowManager(26254): at android.app.Dialog.show(Dialog.java:329) E/WindowManager(26254): at com.pdftron.pdf.utils.Utils.safeShowAlertDialog(Utils.java:1983) E/WindowManager(26254): at com.pdftron.pdf.utils.Utils$3.run(Utils.java:2014) E/WindowManager(26254): at android.app.Activity.runOnUiThread(Activity.java:6282) E/WindowManager(26254): at com.pdftron.pdf.utils.Utils.showAlertDialog(Utils.java:2009) E/WindowManager(26254): at com.pdftron.pdf.controls.PdfViewCtrlTabHostBaseFragment.handleOpenFileFailed(PdfViewCtrlTabHostBaseFragment.java:4440) E/WindowManager(26254): at com.pdftron.pdf.controls.PdfViewCtrlTabHostBaseFragment.onTabError(PdfViewCtrlTabHostBaseFragment.java:1371) E/WindowManager(26254): at com.pdftron.pdf.controls.PdfViewCtrlTabBaseFragment.handleOpeningDocumentFailed(PdfViewCtrlTabBaseFragment.java:7764) E/WindowManager(26254): at com.pdftron.pdf.controls.PdfViewCtrlTabBaseFragment.handleOpeningDocumentFailed(PdfViewCtrlTabBaseFragment.java:7754) E/WindowManager(26254): at com.pdftron.pdf.controls.PdfViewCtrlTabBaseFragment.onDownloadEvent(PdfViewCtrlTabBaseFragment.java:1883) E/WindowManager(26254): at com.pdftron.pdf.PDFViewCtrl$e.handleMessage(SourceFile:12685) E/WindowManager(26254): at android.os.Handler.dispatchMessage(Handler.java:106) E/WindowManager(26254): at android.os.Looper.loop(Looper.java:193) E/WindowManager(26254): at android.app.ActivityThread.main(ActivityThread.java:6669) E/WindowManager(26254): at java.lang.reflect.Method.invoke(Native Method) E/WindowManager(26254): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) E/WindowManager(26254): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

    flutter doctor -v [√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.19043.1348], locale en-US) • Flutter version 2.5.3 at C:\src\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 18116933e7 (7 weeks ago), 2021-10-15 10:46:35 -0700 • Engine revision d3ea636dc5 • Dart version 2.14.4

    [√] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at C:\Users\qwsd\AppData\Local\Android\sdk • Platform android-31, build-tools 31.0.0 • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189) • All Android licenses accepted.

    [√] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

    [√] Android Studio (version 2020.3) • Android Studio at C:\Program Files\Android\Android Studio • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)

    [√] Connected device (1 available) • AOSP on IA Emulator (mobile) • emulator-5554 • android-x86 • Android 9 (API 28) (emulator)

    • No issues found!

    bug 
    opened by aswathi-nambiar 6
  • iOs build failing with the latest update

    iOs build failing with the latest update

    The following build failure message was given after the latest PDFtron update and I don't know where to go fix this:

    Error output from Xcode build: ↳ ** ARCHIVE FAILED **

    Xcode's output: ↳ 2 warnings generated. /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PTFlutterDocumentController.m:94:19: warning: 'isBottomToolbarEnabled' is deprecated: Deprecated in PDFTron for iOS 7.2. Use thumbnailSliderEnabled instead [-Wdeprecated-declarations] if ([self isBottomToolbarEnabled]) { ^ In module 'Tools' imported from /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PdftronFlutterPlugin.h:3: /Users/builder/clone/ios/Pods/PDFNet/Tools.framework/Headers/PTDocumentBaseViewController.h:244:67: note: property 'bottomToolbarEnabled' is declared deprecated here @property (nonatomic, assign, getter=isBottomToolbarEnabled) BOOL bottomToolbarEnabled PT_DEPRECATED_MSG(7.2, "Use thumbnailSliderEnabled instead"); ^ /Users/builder/clone/ios/Pods/PDFNet/Tools.framework/Headers/PTDocumentBaseViewController.h:244:88: note: 'isBottomToolbarEnabled' has been explicitly marked deprecated here @property (nonatomic, assign, getter=isBottomToolbarEnabled) BOOL bottomToolbarEnabled PT_DEPRECATED_MSG(7.2, "Use thumbnailSliderEnabled instead"); ^ In module 'Tools' imported from /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PdftronFlutterPlugin.h:3: /Users/builder/clone/ios/Pods/PDFNet/Tools.framework/Headers/ToolsDefines.h:87:41: note: expanded from macro 'PT_DEPRECATED_MSG' #define PT_DEPRECATED_MSG(version, msg)
    ^ In module 'UIKit' imported from /Users/builder/clone/ios/Pods/Target Support Files/pdftron_flutter/pdftron_flutter-prefix.pch:2: In module 'Foundation' imported from /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8: In module 'CoreFoundation' imported from /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:6: In module 'Darwin' imported from /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:16: /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/usr/include/AvailabilityMacros.h:184:64: note: expanded from macro '
    DEPRECATED_MSG_ATTRIBUTE' #define DEPRECATED_MSG_ATTRIBUTE(s) attribute((deprecated(s))) ^ /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PTFlutterDocumentController.m:440:10: warning: 'bottomToolbarEnabled' is deprecated: Deprecated in PDFTron for iOS 7.2. Use thumbnailSliderEnabled instead [-Wdeprecated-declarations] self.bottomToolbarEnabled = YES; ^ In module 'Tools' imported from /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PdftronFlutterPlugin.h:3: /Users/builder/clone/ios/Pods/PDFNet/Tools.framework/Headers/PTDocumentBaseViewController.h:244:88: note: 'bottomToolbarEnabled' has been explicitly marked deprecated here @property (nonatomic, assign, getter=isBottomToolbarEnabled) BOOL bottomToolbarEnabled PT_DEPRECATED_MSG(7.2, "Use thumbnailSliderEnabled instead"); ^ In module 'Tools' imported from /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PdftronFlutterPlugin.h:3: /Users/builder/clone/ios/Pods/PDFNet/Tools.framework/Headers/ToolsDefines.h:87:41: note: expanded from macro 'PT_DEPRECATED_MSG' #define PT_DEPRECATED_MSG(version, msg)
    ^ In module 'UIKit' imported from /Users/builder/clone/ios/Pods/Target Support Files/pdftron_flutter/pdftron_flutter-prefix.pch:2: In module 'Foundation' imported from /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKit.h:8: In module 'CoreFoundation' imported from /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:6: In module 'Darwin' imported from /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h:16: /Applications/Xcode-12.5.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.5.sdk/usr/include/AvailabilityMacros.h:184:64: note: expanded from macro '
    DEPRECATED_MSG_ATTRIBUTE' #define DEPRECATED_MSG_ATTRIBUTE(s) attribute((deprecated(s))) ^ /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PTFlutterDocumentController.m:445:10: error: 'pageFitsBetweenBars' is unavailable: This API is no longer availble. self.pageFitsBetweenBars = !hidesToolbarsOnTap; // Tools default is enabled. ^ In module 'Tools' imported from /Users/builder/programs/flutter_2_0_6/.pub-cache/git/pdftron-flutter-ba2159839871ec8ecacd7f1ce732b42a7b48318d/ios/Classes/PdftronFlutterPlugin.h:3: /Users/builder/clone/ios/Pods/PDFNet/Tools.framework/Headers/PTDocumentBaseViewController.h:232:28: note: 'pageFitsBetweenBars' has been explicitly marked unavailable here @property (nonatomic) BOOL pageFitsBetweenBars PT_UNAVAILABLE_MSG("This API is no longer availble."); ^ 2 warnings and 1 error generated. note: Using new build system note: Building targets in parallel note: Planning build note: Analyzing workspace note: Constructing build description note: Build preparation complete

    Encountered error while archiveing for device.

    Build failed :| Failed to build for iOS

    Configurations: Flutter: 2.0.3 XCode: 12.5

    This looks to be where the problem is but I can't find where that api is being referenced in my code. Any help would be appreciated!

    opened by sandspoof 6
  • How to save edited document to local storage in flutter?

    How to save edited document to local storage in flutter?

    I have used saveDocument() method but it's not saving. How do I saved the document after editing in to my local storage in flutter when click on leading navigation button.

    opened by abdulhaseeb725 5
  • Can not add new button to top nav like IOS/Android version?

    Can not add new button to top nav like IOS/Android version?

    I want to add my custom button to the top nav bar like I ever did in iOS, but here I can't any solutions to do that even I have read all of your API documents. I hope I will get solution soon! Regards!

    opened by MonipichMP 5
  • OpenDocument as widget not working when PDFTron plugin added locally

    OpenDocument as widget not working when PDFTron plugin added locally

    While trying to add api for flutter, it says to add pdftron-flutter locally. But while doing so opening a doc via widget mode doesn't work. But starting it in new View works.

    Here is the code i used:

    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      String _version = 'Unknown';
      String _document = "http://www.africau.edu/images/default/sample.pdf";
      bool _showViewer = true;
    
      @override
      void initState() {
        super.initState();
        initPlatformState();
        // PdftronFlutter.openDocument("http://www.africau.edu/images/default/sample.pdf");
      }
    
      Future<void> initPlatformState() async {
        String version;
    
        try {
          PdftronFlutter.initialize("your_pdftron_license_key");
          version = await PdftronFlutter.version;
        } on PlatformException {
          version = 'Failed to get platform version.';
        }
    
        if (!mounted) return;
    
        setState(() {
          _version = version;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        // This method is rerun every time setState is called, for instance as done
        // by the _incrementCounter method above.
        //
        // The Flutter framework has been optimized to make rerunning build methods
        // fast, so that you can just rebuild anything that needs updating rather
        // than having to individually change instances of widgets.
        return Scaffold(
          body: Container(
              width: double.infinity,
              height: double.infinity,
              child:
                  _showViewer
                  ? DocumentView(
                      onCreated: _onDocumentViewCreated,
                    )
                  : Container(),
            ),
           // This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    
      void _onDocumentViewCreated(DocumentViewController controller) async {
        print('inside Create Document');
        Config config = new Config();
        var disabledElements = [Buttons.shareButton, Buttons.searchButton];
        var disabledTools = [
          Tools.annotationCreateLine,
          Tools.annotationCreateRectangle
        ];
        config.hideAnnotationToolbarSwitcher = false;
        config.hideTopToolbars = true;
        config.disabledElements = disabledElements;
        config.disabledTools = disabledTools;
        config.showLeadingNavButton = false;
        config.multiTabEnabled = false;
        controller.openDocument(_document);
      }
    }
    

    This is the same code they have used in the example provided with the flutter SDK. And it works for that example.

    Below is the log when i run my code:

    [+23450 ms] Performing Streamed Install
                Success
    [{"event":"app.progress","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931","id":"1","progressId":null,"finished":true}}]
    [   +3 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 shell echo -n 1b2489f3298c7b7a6a47fc957a12a63925567a41 > /data/local/tmp/sky.com.example.local_plugin.sha1
    [  +90 ms] Nokia 6 1 Plus startApp
    [   +6 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 shell am start -a android.intent.action.RUN -f 0x20000000 --ez enable-background-compilation true --ez enable-dart-profiling true --ez enable-checked-mode true --ez verify-entry-points true --ez start-paused true com.example.local_plugin/com.example.local_plugin.MainActivity
    [ +269 ms] Starting: Intent { act=android.intent.action.RUN flg=0x20000000 cmp=com.example.local_plugin/.MainActivity (has extras) }
    [        ] Waiting for observatory port to be available...
    [+1864 ms] Observatory URL on device: http://127.0.0.1:37836/In9UdHdrFLo=/
    [   +2 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 forward tcp:0 tcp:37836
    [  +95 ms] 55226
    [        ] Forwarded host port 55226 to device port 37836 for Observatory
    [   +6 ms] Caching compiled dill
    [ +534 ms] Connecting to service protocol: http://127.0.0.1:55226/In9UdHdrFLo=/
    [   +2 ms] DDS is currently disabled due to https://github.com/flutter/flutter/issues/62507
    [ +434 ms] Successfully connected to service protocol: http://127.0.0.1:55226/In9UdHdrFLo=/
    Waiting for Nokia 6 1 Plus to report its views...
    [{"event":"app.progress","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931","id":"2","progressId":null,"message":"Waiting for Nokia 6 1 Plus to report its views..."}}]
    [{"event":"app.progress","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931","id":"2","progressId":null,"finished":true}}]
    [  +31 ms] DevFS: Creating new filesystem on the device (null)
    [  +51 ms] DevFS: Created new filesystem on the device (file:///data/user/0/com.example.local_plugin/code_cache/local_pluginTURQWW/local_plugin/)
    [   +2 ms] Updating assets
    Debug service listening on ws://127.0.0.1:55226/In9UdHdrFLo=/ws
    [{"event":"app.debugPort","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931","port":55226,"wsUri":"ws://127.0.0.1:55226/In9UdHdrFLo=/ws","baseUri":"file:///data/user/0/com.example.local_plugin/code_cache/local_pluginTURQWW/local_plugin/"}}]
    Syncing files to device Nokia 6 1 Plus...
    [{"event":"app.progress","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931","id":"3","progressId":null,"message":"Syncing files to device Nokia 6 1 Plus..."}}]
    [+1142 ms] Scanning asset files
    [   +4 ms] <- reset
    [        ] Compiling dart to kernel with 0 updated files
    [   +1 ms] <- recompile package:local_plugin/main.dart 7b20ab02-dbac-4eb5-bd81-c3008ba6f7c4
    [        ] <- 7b20ab02-dbac-4eb5-bd81-c3008ba6f7c4
    [ +653 ms] Updating files
    [ +274 ms] DevFS: Sync finished
    [{"event":"app.progress","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931","id":"3","progressId":null,"finished":true}}]
    [   +2 ms] Synced 1.8MB.
    [   +2 ms] <- accept
    [   +9 ms] Connected to _flutterView/0x716c1bc820.
    [{"event":"app.started","params":{"appId":"9c1db0c0-21fb-4927-af7e-068300194931"}}]
    [+3043 ms] W/PlatformViewsController(32745): Creating a virtual display of size: [1080, 2238] may result in problems(https://github.com/flutter/flutter/issues/2897).It is larger than the device screen size: [1080, 2149].
    [  +75 ms] W/Gralloc3(32745): allocator 3.x is not supported
    [ +178 ms] I/flutter (32745): inside Create Document
    [{"id":0,"result":{"value":"android","type":"_extensionType","method":"ext.flutter.platformOverride"}}]
    [{"id":1,"result":{"timeDilation":"1.0","type":"_extensionType","method":"ext.flutter.timeDilation"}}]
    [{"id":2,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.debugPaint"}}]
    [{"id":3,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.debugPaintBaselinesEnabled"}}]
    [{"id":4,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.repaintRainbow"}}]
    [{"id":5,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.showPerformanceOverlay"}}]
    [{"id":6,"result":{"enabled":"true","type":"_extensionType","method":"ext.flutter.debugAllowBanner"}}]
    [{"id":7,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.structuredErrors"}}]
    [{"id":8,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.show"}}]
    [{"id":9,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRebuildDirtyWidgets"}}]
    [{"id":10,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRepaintWidgets"}}]
    [{"id":11,"result":{"enabled":"true","type":"_extensionType","method":"ext.flutter.inspector.structuredErrors"}}]
    [{"id":12,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRebuildDirtyWidgets"}}]
    [{"id":13,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRepaintWidgets"}}]
    

    This code below is the log for when i run the example:

    [        ] Nokia 6 1 Plus startApp
    [   +4 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 shell am start -a android.intent.action.RUN -f 0x20000000 --ez enable-background-compilation true --ez enable-dart-profiling true --ez enable-checked-mode true --ez verify-entry-points true --ez start-paused true com.pdftron.pdftronflutterexample/com.pdftron.pdftronflutterexample.MainActivity
    [ +126 ms] Starting: Intent { act=android.intent.action.RUN flg=0x20000000 cmp=com.pdftron.pdftronflutterexample/.MainActivity (has extras) }
    [   +1 ms] Waiting for observatory port to be available...
    [ +967 ms] Observatory URL on device: http://127.0.0.1:39078/O0XA5yG8XAA=/
    [   +3 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 forward tcp:0 tcp:39078
    [  +85 ms] 49766
    [        ] Forwarded host port 49766 to device port 39078 for Observatory
    [   +6 ms] Caching compiled dill
    [ +420 ms] Connecting to service protocol: http://127.0.0.1:49766/O0XA5yG8XAA=/
    [   +2 ms] DDS is currently disabled due to https://github.com/flutter/flutter/issues/62507
    [ +375 ms] Successfully connected to service protocol: http://127.0.0.1:49766/O0XA5yG8XAA=/
    Waiting for Nokia 6 1 Plus to report its views...
    [{"event":"app.progress","params":{"appId":"fddd7e99-567e-4870-bfdd-b5caf7b5d194","id":"1","progressId":null,"message":"Waiting for Nokia 6 1 Plus to report its views..."}}]
    [{"event":"app.progress","params":{"appId":"fddd7e99-567e-4870-bfdd-b5caf7b5d194","id":"1","progressId":null,"finished":true}}]
    [  +32 ms] DevFS: Creating new filesystem on the device (null)
    [  +44 ms] DevFS: Created new filesystem on the device (file:///data/user/0/com.pdftron.pdftronflutterexample/code_cache/exampleCQIVVD/example/)
    [   +5 ms] Updating assets
    Debug service listening on ws://127.0.0.1:49766/O0XA5yG8XAA=/ws
    [{"event":"app.debugPort","params":{"appId":"fddd7e99-567e-4870-bfdd-b5caf7b5d194","port":49766,"wsUri":"ws://127.0.0.1:49766/O0XA5yG8XAA=/ws","baseUri":"file:///data/user/0/com.pdftron.pdftronflutterexample/code_cache/exampleCQIVVD/example/"}}]
    Syncing files to device Nokia 6 1 Plus...
    [{"event":"app.progress","params":{"appId":"fddd7e99-567e-4870-bfdd-b5caf7b5d194","id":"2","progressId":null,"message":"Syncing files to device Nokia 6 1 Plus..."}}]
    [ +588 ms] Scanning asset files
    [  +14 ms] <- reset
    [        ] Compiling dart to kernel with 0 updated files
    [   +4 ms] <- recompile package:pdftron_flutter_example/main.dart ba10a7ea-7ef4-4eae-8196-1f726b6e666a
    [   +1 ms] <- ba10a7ea-7ef4-4eae-8196-1f726b6e666a
    [ +214 ms] Updating files
    [ +202 ms] DevFS: Sync finished
    [{"event":"app.progress","params":{"appId":"fddd7e99-567e-4870-bfdd-b5caf7b5d194","id":"2","progressId":null,"finished":true}}]
    [   +3 ms] Synced 1.8MB.
    [   +2 ms] <- accept
    [  +10 ms] Connected to _flutterView/0x716bfc0020.
    [{"event":"app.started","params":{"appId":"fddd7e99-567e-4870-bfdd-b5caf7b5d194"}}]
    [+2501 ms] E/com.pdftron.pdf.PDFNet(23070): PDFNet has been initialized in demo mode! A valid key is required for production mode!
    [        ] E/PDFNet  (23070): Bad License Key. PDFNet SDK will work in demo mode. For more
    [        ] E/PDFNet  (23070): information please see http://www.pdftron.com/kb_bad_key
    [ +239 ms] W/PlatformViewsController(23070): Creating a virtual display of size: [1080, 2238] may result in problems(https://github.com/flutter/flutter/issues/2897).It is larger than the device screen size: [1080, 2149].
    [  +98 ms] W/Gralloc3(23070): allocator 3.x is not supported
    [ +281 ms] W/nflutterexampl(23070): Accessing hidden method Landroid/widget/AutoCompleteTextView;->doBeforeTextChanged()V (greylist-max-p, reflection, denied)
    [        ] W/nflutterexampl(23070): Accessing hidden method Landroid/widget/AutoCompleteTextView;->doAfterTextChanged()V (greylist-max-p, reflection, denied)
    [        ] W/nflutterexampl(23070): Accessing hidden method Landroid/widget/AutoCompleteTextView;->ensureImeVisible(Z)V (greylist-max-p, reflection, denied)
    [{"id":0,"result":{"value":"android","type":"_extensionType","method":"ext.flutter.platformOverride"}}]
    [{"id":1,"result":{"timeDilation":"1.0","type":"_extensionType","method":"ext.flutter.timeDilation"}}]
    [{"id":2,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.debugPaint"}}]
    [{"id":3,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.debugPaintBaselinesEnabled"}}]
    [{"id":4,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.repaintRainbow"}}]
    [{"id":5,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.showPerformanceOverlay"}}]
    [{"id":6,"result":{"enabled":"true","type":"_extensionType","method":"ext.flutter.debugAllowBanner"}}]
    [{"id":7,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.structuredErrors"}}]
    [{"id":8,"result":{"enabled":"true","type":"_extensionType","method":"ext.flutter.inspector.structuredErrors"}}]
    [{"id":9,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.show"}}]
    [{"id":10,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRebuildDirtyWidgets"}}]
    [{"id":11,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRebuildDirtyWidgets"}}]
    [{"id":12,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRepaintWidgets"}}]
    [{"id":13,"result":{"enabled":"false","type":"_extensionType","method":"ext.flutter.inspector.trackRepaintWidgets"}}]
    [ +467 ms] W/nflutterexampl(23070): Accessing hidden field Landroid/view/View;->mAccessibilityDelegate:Landroid/view/View$AccessibilityDelegate; (greylist, reflection, allowed)
    [ +176 ms] I/FloatingActionButton(23070): Setting a custom background is not supported.
    [  +18 ms] I/FloatingActionButton(23070): Setting a custom background is not supported.
    [+1298 ms] I/chatty  (23070): uid=10033(com.pdftron.pdftronflutterexample) identical 1 line
    [        ] I/FloatingActionButton(23070): Setting a custom background is not supported.
    [ +114 ms] W/nflutterexampl(23070): Accessing hidden field Lsun/misc/Unsafe;->theUnsafe:Lsun/misc/Unsafe; (greylist, reflection, allowed)
    [   +2 ms] W/nflutterexampl(23070): Accessing hidden method Lsun/misc/Unsafe;->allocateInstance(Ljava/lang/Class;)Ljava/lang/Object; (greylist, reflection, allowed)
    [ +168 ms] W/nflutterexampl(23070): Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
    [ +249 ms] I/OpenGLRenderer(23070): Davey! duration=2766ms; Flags=1, IntendedVsync=36760260755913, Vsync=36760260755913, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=36760261395402, AnimationStart=36760261494517, PerformTraversalsStart=36760261500350, DrawStart=36762947369516, SyncQueued=36762973268682, SyncStart=36762973787745, IssueDrawCommandsStart=36762974348995, SwapBuffers=36763025719672, FrameCompleted=36763028051339, DequeueBufferDuration=4547000, QueueBufferDuration=1154000, 
    [  +83 ms] I/OpenGLRenderer(23070): Davey! duration=2835ms; Flags=1, IntendedVsync=36760277427364, Vsync=36763060760586, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=36763071711807, AnimationStart=36763071798995, PerformTraversalsStart=36763074752589, DrawStart=36763109312901, SyncQueued=36763110748214, SyncStart=36763111899099, IssueDrawCommandsStart=36763112039411, SwapBuffers=36763112803786, FrameCompleted=36763113935661, DequeueBufferDuration=153000, QueueBufferDuration=301000, 
    [  +22 ms] I/OpenGLRenderer(23070): Davey! duration=2863ms; Flags=1, IntendedVsync=36760277427364, Vsync=36763060760586, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=36763071711807, AnimationStart=36763071798995, PerformTraversalsStart=36763074752589, DrawStart=36763129963786, SyncQueued=36763133373161, SyncStart=36763133851807, IssueDrawCommandsStart=36763134189984, SwapBuffers=36763137734255, FrameCompleted=36763140921911, DequeueBufferDuration=155000, QueueBufferDuration=1212000, 
    [ +123 ms] D/com.pdftron.pdf.utils.Utils(23070): cacheFile: /data/user/0/com.pdftron.pdftronflutterexample/cachefreetext_1107451708.srl; exists: false; length:0
    [ +143 ms] I/FloatingActionButton(23070): Setting a custom background is not supported.
    [ +113 ms] I/chatty  (23070): uid=10033(com.pdftron.pdftronflutterexample) identical 2 lines
    [   +1 ms] I/FloatingActionButton(23070): Setting a custom background is not supported.
    [        ] I/DpmTcmClient(23070): RegisterTcmMonitor from: $Proxy0
    [+4903 ms] I/nflutterexampl(23070): NativeAlloc concurrent copying GC freed 171390(9448KB) AllocSpace objects, 32(8520KB) LOS objects, 49% free, 5674KB/11MB, paused 118us total 154.693ms
    [ +376 ms] D/com.pdftron.pdf.utils.Utils(23070): cacheFile: /data/user/0/com.pdftron.pdftronflutterexample/cachefreetext_-239901360.srl; exists: false; length:0
    [ +122 ms] I/OpenGLRenderer(23070): Davey! duration=764ms; Flags=1, IntendedVsync=36768161246042, Vsync=36768794579350, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=36768807635243, AnimationStart=36768807723159, PerformTraversalsStart=36768808785920, DrawStart=36768879405034, SyncQueued=36768892078628, SyncStart=36768892410190, IssueDrawCommandsStart=36768897360555, SwapBuffers=36768924568993, FrameCompleted=36768925646545, DequeueBufferDuration=229000, QueueBufferDuration=283000, 
    [+171761 ms] Service protocol connection closed.
    [   +2 ms] Lost connection to device.
    [  +12 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 forward --list
    [  +53 ms] Exit code 0 from: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 forward --list
    [        ] DRGID19100401278 tcp:49414 tcp:43345
               DRGID19100401278 tcp:49766 tcp:39078
    [   +1 ms] executing: C:\Users\frostedfire\AppData\Local\Android\sdk\platform-tools\adb.exe -s DRGID19100401278 forward --remove tcp:49414
    [   +6 ms] DevFS: Deleting filesystem on the device (file:///data/user/0/com.pdftron.pdftronflutterexample/code_cache/exampleCQIVVD/example/)
    
    

    But if I were to use PdftronFlutter.openDocument("http://www.africau.edu/images/default/sample.pdf"); in initstate It works fine. I just can't seem to find what the difference is?

    Edit

    Actually even project where i called the flutter sdk from the git package isn't able to run the widget version. Only inside the sdk's example project am I able to run the widget version.

    opened by KarthikSayone 5
  • PageViewMode and FitMode Adjustments after Document is opened

    PageViewMode and FitMode Adjustments after Document is opened

    BUG / MISSING FUNCTIONALITY Currently, you can just pass the PageViewMode and FitMode to the config at the beginning. You cannot manipulate them after document is opened.

    EXPECTED It would be very nice to have some functions on the DocumentViewController like setPageViewMode() or setFitMode() to adjust these things in advance.

    ADDITIONAL CONTEXT For example, I have an orientation listener and I want to set these values according to portrait (Single Page) and landscape (Facing Pages).

    enhancement 
    opened by leo-neon 1
  • Can't share or export the document on iOS

    Can't share or export the document on iOS

    Describe the bug When I try to export the document to save a copy I get an error on the console saying "Could not save document for export" and the dialog that shows "Exporting" with a loading indicator stays there blocking the user to do any actions.

    And when I try to share the document I get an error popup saying "Document could not be shared".

    Steps to Reproduce the Problem

    1. Open a document with PdftronFlutter.openDocument
    2. Click on three dot menu on the right top
    3. Try to share or export the document
    4. See error

    Expected behavior I should be able to share and export the document

    Platform/Device Information (please complete the following information if applicable):

    • Platform: iOS
    • Device: iPhone 12
    • OS: iOS 15.1.1

    Additional context Here is my Config:

    final config = Config()
          ..readOnly = true
          ..hideAnnotationToolbarSwitcher = true
          ..hideDefaultAnnotationToolbars = [
            DefaultToolbars.annotate,
            DefaultToolbars.draw,
            DefaultToolbars.insert,
            DefaultToolbars.fillAndSign,
            DefaultToolbars.prepareForm,
            DefaultToolbars.measure,
            DefaultToolbars.pens,
            DefaultToolbars.redaction,
            DefaultToolbars.favorite,
          ]
          ..hideBottomToolbar = true
          ..autoSaveEnabled = false
          ..disabledElements = [
            Buttons.editPagesButton,
            Buttons.viewControlsButton,
          ];
    
        final exportPath = Platform.isAndroid
            ? '/storage/emulated/0/Download/'
            : (await getApplicationDocumentsDirectory()).path;
    
        config.exportPath = exportPath;
    
    bug 
    opened by alifurkanbudak 0
  • [Android] Export/Import Annotation Command does not work properly when Annotation Manager is not enabled

    [Android] Export/Import Annotation Command does not work properly when Annotation Manager is not enabled

    Describe the bug https://support.pdftron.com/a/tickets/27079

    Steps to Reproduce the Problem

    1. Use startExportAnnotationCommandListener and importAnnotationCommand in tandem
    2. Duplicate annotation created (looks like another unique ID is generated instead of updating the old one)
    3. Above steps do not happen when AnnotationManagerEnabled is set to true, but in theory it should work without it

    Platform/Device Information (please complete the following information if applicable):

    • Platform: Android
    bug 
    opened by ama-pdftron 0
  • `importAnnotations` works when called before `openDocument`

    `importAnnotations` works when called before `openDocument`

    Describe the bug On the branch export-annotations-bug, I created a two screen application: one is the Home Screen and the other renders the DocumentView. In the method used to control the PDFTron viewer, I included a call to importAnnotations before openDocument. I noticed the following when using the iOS plugin:

    When navigating to the PDFTron viewer for the first time, the call to importAnnotations fails. After heading back to the Home Screen and then to the viewer, the call to importAnnotations works.

    Steps to Reproduce the Problem

    1. Switch to the export-annotations-bug.
    2. Run the project on the iOS simulator.
    3. Switch to the PDFTron viewer page.
    4. Press the leading navigation button to go back to the Home Screen.
    5. Switch to the PDFTron viewer page.

    Expected behavior The call to importAnnotations should always fail since it was done before openDocument finished.

    Screenshots In both cases importAnnotations is importing a red box unto page 2.

    Using the iOS plugin: https://user-images.githubusercontent.com/83605527/138756002-138da7f9-ec80-4c83-a014-1812fb72d7f3.mp4

    Using the iOS widget: https://user-images.githubusercontent.com/83605527/138758478-2ff166b2-04fc-472a-b6a0-bccc3f03cb5d.mp4

    Platform/Device Information

    • Platform: iOS
    • Device: iPod touch 7th Generation
    • OS: 14.4

    Additional context Observations I made while debugging the application:

    OS | Widget | Plugin -- | -- | -- Android | If importAnnotations is called before openDocument, a NullPointerException occurs in checkFunctionPrecondition. | Same behaviour as the Android widget. iOS | If importAnnotations was called before openDocument, the property_documentLoaded was always equal to NO. After moving back to the Home Screen, a dealloc method is called when moving to the DocumentView. | If importAnnotations is called before openDocument:
    * On the first run, _tabbedDocumentViewController = nil so the import fails.
    * On the second run, _documentLoaded = YES, so the import works. No dealloc method is called.

    A "run" refers to moving from the Home Screen to the PDFTron viewer.

    There is a bug in the application that limits the number of runs to two when using the plugin.

    bug ios 
    opened by dcupidon 0
  • `await controller.openDocument()` is not being waited on

    `await controller.openDocument()` is not being waited on

    Describe the bug Other DocumentViewController methods are running before openDocument() finishes even though the await keyword is being used. When debugging with Android Studio, I realized that onTabDocumentLoaded was not being called after openDocument.

    Steps to Reproduce the Problem

    1. Use example/lib/main.dart and uncomment the code needed to use the widget view.
    2. In onDocumentViewCreated place any method call after await controller.openDocument(_document, config: config);, where _document = "https://pdftron.s3.amazonaws.com/downloads/pl/PDFTRON_mobile_about.pdf"
    3. Run app

    Expected behavior The document would have opened as normal and the methods called would have ran in order.

    Screenshots Call stack: Screen Shot 2021-07-09 at 12 29 16 PM

    Platform/Device Information (please complete the following information if applicable):

    • Platform: Android
    • Device: Pixel 3a
    • OS: Android 11
    bug android 
    opened by dcupidon 0
Releases(legacy-ui)
Owner
PDFTron Systems Inc.
Bring PDF, CAD, & MS Office capabilities to any software
PDFTron Systems Inc.
A pure Dart utility library that checks for an internet connection by opening a socket to a list of specified addresses, each with individual port and timeout. Defaults are provided for convenience.

data_connection_checker A pure Dart utility library that checks for an internet connection by opening a socket to a list of specified addresses, each

Kristiyan Mitev 103 Nov 29, 2022
RoomKit Flutter is a wrapper of Native Android and iOS RoomKit SDK

ZEGOCLOUD RoomKit Flutter RoomKit Flutter is a wrapper of Native Android and iOS RoomKit SDK Getting started Prerequisites Basic requirements Android

null 0 Dec 16, 2022
Woocommerce SDK for Flutter. The Complete Woo Commerce SDK for Flutter.

woocommerce Woocommerce SDK for Flutter. Getting Started Add the package to your pubspec.yaml and import. import 'package:woocommerce/woocommerce.dart

RAY 105 Dec 6, 2022
Learn to Code While Building Apps - The Complete Flutter Development Bootcamp

BMI Calculator ?? Our Goal The objective of this tutorial is to look at how we can customise Flutter Widgets to achieve our own beautiful user interfa

London App Brewery 146 Jan 1, 2023
Learn to Code While Building Apps - The Complete Flutter Development Bootcamp

Quizzler ❓ Our Goal In this tutorial we will be reviewing Stateful and Stateless Widgets as well as learning about the fundamental building blocks of

London App Brewery 169 Dec 31, 2022
Practice building basic animations in apps along with managing app state by BLoC State Management, Flutter Slider.

Practice building basic animations in apps along with managing app state by BLoC State Management including: Cubit & Animation Widget, Flutter Slider.

TAD 1 Jun 8, 2022
Bug reporting SDK for Flutter apps.

Shake for Flutter Flutter plugin for Shake. How to use Install Shake Add Shake to your pubspec.yaml file. dependencies: shake_flutter: ^15.0.0 I

Shake 13 Oct 18, 2022
Widgets for Digital Health - Use the Flutter(tm) SDK to build healthcare apps fast.

Faiadashu™ FHIRDash — Widgets for Digital Health Mission Build beautiful healthcare apps fast — use the Flutter™ SDK and follow the HL7® FHIR® standar

Tilo 22 Dec 19, 2022
🚗 Apple CarPlay for Flutter Apps. Aims to make it safe to use apps made with Flutter in the car by integrating with CarPlay.

CarPlay with Flutter ?? Flutter Apps now on Apple CarPlay! flutter_carplay aims to make it safe to use iPhone apps made with Flutter in the car by int

Oğuzhan Atalay 156 Dec 26, 2022
[Example APPS] Basic Flutter apps, for flutter devs.

Show some ❤️ and star the repo to support the project This repository containing links of all the example apps demonstrating features/functionality/in

Pawan Kumar 17.9k Jan 2, 2023
Flutter-Apps-Collection: a collection of apps made in flutter for learning purpose

Flutter-Apps-Collection This is a repository of a collection of apps made in flutter for learning purpose Some Screenshots . . . Apps build in Flutter

Himanshu Singh 96 May 27, 2022
Projeto do curso Criação de Apps Android e iOS com Flutter 2021-Crie 14 Apps. Professor: Daniel Ciolfi

agenda_contatos Projeto do curso de Flutter Getting Started This project is a starting point for a Flutter application. A few resources to get you sta

Waldir Tiago Dias 0 Nov 27, 2021
Projeto do curso Criação de Apps Android e iOS com Flutter 2021-Crie 14 Apps. Professor: Daniel Ciolfi

busca_gifs A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if th

Waldir Tiago Dias 0 Nov 25, 2021
This is an apps that implements fundamental features of Flutter (Android Apps Only)

rpl_apps_flutter A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started

Fakhry 0 Dec 28, 2021
Github-apps-flutter - Github Apps Build Using bloc 8.0 and Github API

Github_apps Inspiration This app is made to build using bloc 8.0 and github API.

Irvan Lutfi Gunawan 18 Apr 14, 2022
O school_app é uma Aplicação Mobile para uma escola que foi desenvolvida utilizando Flutter SDK/Dart

O school_app é uma Aplicação Mobile para uma escola que foi desenvolvida utilizando Flutter SDK/Dart(Para o aplicativo móvel), Node.Js (Para a API) e PostgreSQL(Para o Banco de dados).

null 2 May 21, 2022
A new video calling mobile application using Flutter, Agora SDK and GetX state management.

LiveBox : A Video Calling App A new video calling mobile application using Flutter, Agora SDK and GetX state management. Features Login Registration F

Nikhil Rajput 14 Dec 3, 2022
CARP Mobile Sensing for Flutter, including mobile sensing framework, data backend support, and the CARP mobile sensing app.

This repo hold the source code for the CACHET Research Platform (CARP) Mobile Sensing (CAMS) Flutter software. It contains the source code for CACHET

Copenhagen Center for Health Technology (CACHET) 61 Dec 16, 2022
Howl.js wrapper for Flutter

flutter_web_howl Howl.js wrapper for Flutter https://pub.dev/packages/flutter_web_howl You can now include Howl.js using initializeHowl() anywhere in

Florent CHAMPIGNY 2 Feb 8, 2022