flutter_pom 0.1.28

  • Readme
  • Changelog
  • Example
  • Installing
  • 74

flutter_pom #

Flutter Persistent Object Mapper based on sqflite provides model based SQLite access including automatic database creation

Installing #

Add dependency #

Add this to your package's pubspec.yaml file:

dependencies:
  flutter_pom: ^0.0.3

Install the plugin #

Now you can install the package (if you got it from pub.dev) via console.

$ flutter pub get

Import the plugin #

Finally you have to import the plugin into your Dart source

import 'package:flutter_pom/flutter_pom.dart';

Example #

To kickstart with the newly installed library you will have to create the necessary model and database classes.

Create the Table-model #

The table model represents the configuration of your table. This includes all columns and the table name. In order to work this needs to extend from Table (flutter_pom).

class SampleTable extends Table {
  // The constructor has to call 'super' with the name of the table
  SampleTable() : super("sample_table");
  
  // These are the fields that we define for the table.
  // Each field corresponds to a table column
  
  final IdField id = IdField("id").autoIncrement();
  final StringField str = StringField("str");
  
  // You have to override the method 'getInstance' for the
  // deserializer to get a new instance of your type as dart
  // does not support reflection well by now.
  
  @override
  Table getInstance() {
    return SampleTable();
  }
  
  // initializeFields provides the TableBuilder in the background
  // with all defined fields. As dart does not support reflection 
  // this is our way to go.
  
  @override
  List<Field> initializeFields() {
    return [
      id,
      str
    ];
  }
}

Create the Database model #

Next you have to create a database model. The model needs to be inherited from Database (flutter_pom). The database model contains all tables that you want to access inside the specified database.

Note: There can be more than one database model inside your app

class SampleDb extends Database {
  // The constructor has to call 'super' with the database name
  SampleDb() : super("sample.db");
  
  // initializeDatabase provides the DatabaseBuilder in the background
  // with all containing databases. As dart does not support reflection
  // this is our way to go.
  
  @override
  Map<Type, Table> initializeDatabase() {
    return <Type, Table>{
      SampleTable: SampleTable()
    };
  }
}

Use the database in your App Logic #

Now its time to make use of the newly created database and tables.

void Do() async {
  
    // initialize the database
    var db = SampleDb();
    
    // open() the connection to the database. 
    // This method has to be called once before 
    // accessing the database
    await db.open();
    
    // Get the automatically created context of the 
    // table 'SampleTable'
    var context = await db.of<SampleTable>();
    
    // Create a new SampleTable item (think of it as a row)
    var sampleItem = SampleTable();
    
    // Access the str field
    sampleItem.str.value = "String value";
    
    // Put the item into the database
    await context.put(sampleItem);
    
    // Get all items 
    var itemsFilter = await context.select();
    
    // A complex filter scenario with comparison of 
    // field values and ordering
    // We also support limiting and offsets
    var itemsFilter2 = await c.select((q) {
          return q
                 .where(c.fields.idField.gte(3))
                 .and(c.fields.idField.lte(20))
                 .orderByAsc([c.fields.idField])
                 .limit(40)
                 .offset(2);
        });    
    
    // NOTICE: There is an alternative way of querying 
    // data using Dart included test methods.
    // The downside of this approach is that all data will 
    // be queried and cached before the
    // filtering begins. 
    // For datasets > 1k items you should use the 'select' 
    // method to do filtering on db level
    // instead.
    //
    // The following query filters the exact same data 
    // like 'itemsFilter2' without ordering 
    // and limiting. This can later be done with dart language 
    
    var itemsFilter3 = await c.where((i) => 
                                i.idField.value >= 3 &&
                                i.idField.value <= 20);
    
    // Count all items
    var count1 = await c.count();
    
    // Count all items where id >= 3 and id <= 20
    var count2 = await c.count((q) {
           return q
                  .where(c.fields.idField.gte(3))
                  .and(c.fields.idField.lte(20));
        });
    
    // Delete the item
    await context.delete(sampleItem);
    
    // Update the item. Only changed values will be updated.
    await context.update(sampleItem);
    
    // Register for the onCreate Stream that gets fired 
    // everytime somebody adds an item
    context.onCreate.listen((sampleItem) {
      // do something with the item
    });
}

Relating Tables #

Starting with version 0.1.23 you can now bind tables to a field. This gives you the chance to create dependent tables you can query with a new list extension.

For now only 1:1 relations are supported.

The following code will give you an example of how to get started:

class User extends Table {
  /// We only show things that changed here. 
  /// The Table implementation is still the same 
  /// as described prior.
  StringField userName = StringField("user_name").notNull();
 
  /// Here we reference the job table. 
  /// The framework will internally save the id of the
  /// referenced table item only
  KeyField<Job> job = KeyField<Job>("job_id");
}

/// You may want to manage existing jobs in a seperate table
class Job extends Table {
  /// Same as above
  StringField jobName = StringField("job_name").notNull();
}


/// Example Method adding a new user with a *new* job
void addUser(User user, Job job) async {
  var users = await db.of<User>();  
  var jobs = await db.of<Job>();
  
  user.job.binding = job;
  
  await jobs.put(job);
  await users.put(user);
}

/// Example method reading all users and resolving 
/// all job items automatically
void getUsers() async {
  var users = await db.of<User>();
  var jobs = await db.of<Job>();
  
  /// Here we select all users and then call the method
  /// 'include' on the resulting list.
  /// 'include' expects the database context and the field
  /// you want to resolve.
  var userList = users.select().include<Job>(db, User().job);
}

Indexing fields #

You can easily let POM create indexes for your fields by adding .withIndex() to the field definition:

StringField email = StringField("email").withIndex(unique: true);

You can also define whether the indexed values shall be unique or not.

Transaction Support (since 0.1.26) #

You can easily manage your transactions by using the 'transaction()' method of your database and provide it to all supported methods inside your context.

Example:

var txn = db.transaction();

await db.of<User>().add(newUser, txn);
await db.of<User>().deleteById(5, txn);

await txn.commit();

[0.1.28] - 26.03.2020 #

  • Migration Bugfix

[0.1.27+3] - 26.03.2020 #

  • Migration Bugfix

[0.1.27+2] - 26.03.2020 #

  • Debug Build

[0.1.27+1] - 26.03.2020 #

  • Removed 'autoOpen' property for Databases. Major!!

[0.1.27] - 26.03.2020 #

  • Fixed Migration: Bug that prevented the correct migration of non-versioned databases
  • Added 'enableMigrations()' and 'disableMigrations()'

[0.1.26+2] - 26.03.2020 #

  • Added new QueryBuilder for delete() queries.

[0.1.26+1] - 13.03.2020 #

  • Fixed NullException bug when get(id) returned empty content.

[0.1.26] - 11.03.2020 #

  • Added support for Transactions
  • Fixed bug when deleting entities with non-integer ID fields

[0.1.25] - 21.02.2020 #

  • Added indexing support for all types of fields and automatic index creation

[0.1.24+1] - 11.02.2020 #

  • Moved repository to GitHub

[0.1.24] - 10.02.2020 #

  • Removed logging for now. It will be available again in the next release in a configurable form
  • Fixed a bug that lead to error-messages while querying 'last_row_id()' for non-Integer key fields

[0.1.23+1] - 30.01.2020 #

  • Added new Section do Documentation showing the usage of the KeyField

[0.1.23] - 30.01.2020 #

  • You can now reference other tables inside a table using the KeyField field

[0.1.22] - 29.01.2020 #

  • Fixed critical bug in 'delete' builder that prevented creating a valid query

[0.1.21] - 28.01.2020 #

  • Fixed migration related bugs

[0.1.20] - 28.01.2020 #

  • Fixed migration related bugs

[0.1.19] - 27.01.2020 #

  • Added 'distinct' method for querying single field values distinct

[0.1.18+4] - 27.01.2020 #

  • Fixed value assignment bug on query deserialization

[0.1.18+3] - 27.01.2020 #

  • Fixed value assignment bug in SecureString field

[0.1.18+2] - 27.01.2020 #

  • Fixed String comparison of SecureString field

[0.1.18+1] - 27.01.2020 #

  • Moved FieldExtensions to Field Class

[0.1.18] - 27.01.2020 #

  • Added Logging Framework for better insights on whats going on

[0.1.17] - 27.01.2020 #

  • Added 'enableMigrations: bool' to Database. This enables automatic migration in case of new fields
  • In your table you can now override the method 'Future
  • Fixed bug in 'update' QueryBuilder
  • Fixed bug in 'delete' QueryBuilder

[0.1.16+3] - 24.01.2020 #

  • Removed 'event' section from library. This is a cosmetic thing as it was not used in production until not

[0.1.16+2] - 24.01.2020 #

  • Dart-Formatting aligned

[0.1.16+1] - 24.01.2020 #

  • Fixed UpdateBuilder to include SET statements properly
  • Did some more refactoring and formatting

[0.1.16] - 24.01.2020 #

  • Added Streams for 'onCreate', 'onDelete' and 'onUpdate'

[0.1.15+1] - 23.01.2020 #

  • Removed unnecessary dependencies in pubspec.

[0.1.15] - 23.01.2020 #

  • Introduced 'where' method to do dart-side filtering of cached data

[0.1.14+2] - 23.01.2020 #

  • You can now access the fields inside QueryBuilder by '.fields' Property

[0.1.14+1] - 23.01.2020 #

  • Extended Exports for fields

[0.1.14] - 23.01.2020 #

  • Added QueryBuilder Framework to make query building more reliable

[0.1.13] - 23.01.2020 #

  • Removed unused dart:convert import
  • Adapted Sample to meet current API

[0.1.12] - 23.01.2020 #

  • Removed getRange for 'select()' and 'count()' methods that use QueryBuilder as arguments

[0.1.11] - 23.01.2020 #

  • Added NULL conversion fix for String Fields
  • SQL Creation is now more generic
  • Changed some underlying Field implementations
  • Added SQLHelper for generating Decision Trees

[0.1.10] - 23.01.2020 #

  • Added constraint to prevent infinite or negativeInfinite values on double fields.

[0.1.9] - 23.01.2020 #

  • Fixed bug in context creation
  • Fixed bug with nullable Datetime objects

[0.1.8] - 22.01.2020 #

  • Changed method parameter signature of get() to use 'dynamic' instead of fields
  • Mapping of id Field in 'get' now works internally

[0.1.7] - 22.01.2020 #

  • Changed method parameter signature of get() to use Fields instead of ids.

[0.1.6] - 17.01.2020 #

  • Removed migrations for now

[0.1.5] - 17.01.2020 #

  • Bugfix release

[0.1.4] - 17.01.2020 #

  • Bugfix release

[0.1.3] - 17.01.2020 #

  • Bugfix release

[0.1.2] - 17.01.2020 #

  • Bugfix release

[0.1.1] - 17.01.2020 #

  • Bugfix release

[0.1.0] - 17.01.2020 #

  • Added automatic migrations and overridable migrations

[0.0.9] - 16.01.2020 #

  • Fixed update statement to include primary keys and disable auto-increment fields

[0.0.8] - 16.01.2020 #

  • Added more reliability and flexibility for value to field mapping of various types
  • Implemented more unit tests for better coverage

[0.0.7] - 16.01.2020 #

  • Removed unnecessary constraints disabling primary-keys for several fields
  • Changed parameter signature of "fromSql" to dynamic

[0.0.6] - 16.01.2020 #

  • Added specific errors
  • Added Unit-Testing
  • Fixed bugs with handling notNull constraints
  • Fixed bugs with handling autoIncrement constraints
  • Fixed bugs with handling mapping errors

[0.0.5] - 16.01.2020 #

  • The export for SecureString was missing

[0.0.4] - 16.01.2020 #

  • Added SecureStringField to provide a hashed database field for storing passwords etc.
  • Changed field signature of StringField from VARCHAR(255) to TEXT

[0.0.3] - 16.01.2020 #

  • New MIT License agreement was added to the root package
  • Fixed install instructions to make use of pub.dev instead of using a local path
  • Changed Homepage to a secure URI

[0.0.2] - 16.01.2020 #

  • Started satisfying all required publishing specs

[0.0.1] - 16.01.2020 #

  • Initial Release

example/lib/main.dart

import 'package:example/pom/sample_table.dart';
import 'package:example/pom/sample_table_2.dart';
import 'package:flutter/material.dart';
import 'package:flutter_pom/flutter_pom.dart';

import 'pom/sample_db.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter POM Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  SampleDb db = SampleDb();

  void _incrementCounter() async {
    var c1 = await db.of<SampleTable>();
    var c2 = await db.of<SampleTable2>();

    var item1 = SampleTable();
    item1.counterValue.value = _counter + 1;
    item1.dateTime.value = DateTime.now();

    await c1.put(item1);

    var item = SampleTable2();
    item.counterValue.value = _counter + 1;
    item.dateTime.value = DateTime.now();
    item.keyField.binding = item1;

    await c2.put(item);

    var itemRef = await c2.select();
    var items = await itemRef.include<SampleTable>(db, SampleTable2().keyField);

    print(items);

    setState(() {
      // This call to setState tells the Flutter framework that something has
      // changed in this State, which causes it to rerun the build method below
      // so that the display can reflect the updated values. If we changed
      // _counter without calling setState(), then the build method would not be
      // called again, and so nothing would appear to happen.
      _counter++;
    });
  }

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

  @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(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
      ),
      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: Column(
          // Column is also a layout widget. It takes a list of children and
          // arranges them vertically. By default, it sizes itself to fit its
          // children horizontally, and tries to be as tall as its parent.
          //
          // Invoke "debug painting" (press "p" in the console, choose the
          // "Toggle Debug Paint" action from the Flutter Inspector in Android
          // Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
          // to see the wireframe for each widget.
          //
          // Column has various properties to control how it sizes itself and
          // how it positions its children. Here we use mainAxisAlignment to
          // center the children vertically; the main axis here is the vertical
          // axis because Columns are vertical (the cross axis would be
          // horizontal).
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  flutter_pom: ^0.1.28

2. Install it

You can install packages from the command line:

with Flutter:


$ flutter pub get

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:flutter_pom/flutter_pom.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
53
Health:
Code health derived from static analysis. [more]
100
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
90
Overall:
Weighted score of the above. [more]
74
Learn more about scoring.

We analyzed this package on Apr 3, 2020, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.7.1
  • pana: 0.13.6
  • Flutter: 1.12.13+hotfix.8

Health suggestions

Format lib/builder/query_distinct_builder.dart.

Run flutter format to format lib/builder/query_distinct_builder.dart.

Format lib/context/base_model_context.dart.

Run flutter format to format lib/context/base_model_context.dart.

Format lib/context/base_model_transaction.dart.

Run flutter format to format lib/context/base_model_transaction.dart.

Fix additional 6 files with analysis or formatting issues.

Additional issues in the following files:

  • lib/context/model_context.dart (Run flutter format to format lib/context/model_context.dart.)
  • lib/context/model_transaction.dart (Run flutter format to format lib/context/model_transaction.dart.)
  • lib/context/pom_logger.dart (Run flutter format to format lib/context/pom_logger.dart.)
  • lib/extensions/list_extensions.dart (Run flutter format to format lib/extensions/list_extensions.dart.)
  • lib/model/database.dart (Run flutter format to format lib/model/database.dart.)
  • lib/model/field.dart (Run flutter format to format lib/model/field.dart.)

Maintenance issues and suggestions

Make sure dartdoc successfully runs on your package's source files. (-10 points)

exitCode: 255 stdout: parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/update_builder.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/query_count_builder.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/query_distinct_builder.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/query_select_builder.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/selectors/sql_selector.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/selectors/sql_condition.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/selectors/sql_where_selector.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/query_delete_builder.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/builder/query_builder.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/context/base_model_context.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/context/pom_logger.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/context/base_model_transaction.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/context/migration_context.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/context/model_context.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/context/model_transaction.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/extensions/list_extensions.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/errors/missing_field_error.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/errors/table_configuration_error.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/errors/field_constraint_error.dart... parsing /tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/errors/duplicate_field_error.dart... [...] Generating docs for library model_transaction from package:flutter_pom/context/model_transaction.dart... Generating docs for library multiple_primary_key_error from package:flutter_pom/errors/multiple_primary_key_error.dart... Generating docs for library object_field from package:flutter_pom/model/fields/object_field.dart... Generating docs for library pom_logger from package:flutter_pom/context/pom_logger.dart... Generating docs for library query_builder from package:flutter_pom/builder/query_builder.dart... Generating docs for library query_count_builder from package:flutter_pom/builder/query_count_builder.dart... Generating docs for library query_delete_builder from package:flutter_pom/builder/query_delete_builder.dart... Generating docs for library query_distinct_builder from package:flutter_pom/builder/query_distinct_builder.dart... Generating docs for library query_select_builder from package:flutter_pom/builder/query_select_builder.dart... Generating docs for library secure_string_field from package:flutter_pom/model/fields/secure_string_field.dart... Generating docs for library serializable from package:flutter_pom/model/serializable.dart... Generating docs for library sql_condition from package:flutter_pom/builder/selectors/sql_condition.dart... Generating docs for library sql_selector from package:flutter_pom/builder/selectors/sql_selector.dart... Generating docs for library sql_types from package:flutter_pom/model/sql_types.dart... Generating docs for library sql_where_selector from package:flutter_pom/builder/selectors/sql_where_selector.dart... Generating docs for library string_field from package:flutter_pom/model/fields/string_field.dart... Generating docs for library table_configuration_error from package:flutter_pom/errors/table_configuration_error.dart... Generating docs for library update_builder from package:flutter_pom/builder/update_builder.dart... Validating docs... Documented 38 public libraries in 11.7 seconds stderr: Documenting flutter_pom... warning: private API of package:Dart is reexported by libraries in other packages: from E: (file:///flutter/bin/cache/pkg/sky_engine/lib/collection/collections.dart:13:28) referred to by collection: (file:///tmp/pub-cache-dirUFUDSJ/hosted/pub.dartlang.org/collection-1.14.11/lib/collection.dart:1:1) referred to by dart.pkg.collection.wrappers: (file:///tmp/pub-cache-dirUFUDSJ/hosted/pub.dartlang.org/collection-1.14.11/lib/wrappers.dart:7:9) warning: private API of package:Dart is reexported by libraries in other packages: from K: (file:///flutter/bin/cache/pkg/sky_engine/lib/collection/maps.dart:374:27) referred to by collection: (file:///tmp/pub-cache-dirUFUDSJ/hosted/pub.dartlang.org/collection-1.14.11/lib/collection.dart:1:1) referred to by dart.pkg.collection.wrappers: (file:///tmp/pub-cache-dirUFUDSJ/hosted/pub.dartlang.org/collection-1.14.11/lib/wrappers.dart:7:9) warning: private API of package:Dart is reexported by libraries in other packages: from V: (file:///flutter/bin/cache/pkg/sky_engine/lib/collection/maps.dart:374:30) referred to by collection: (file:///tmp/pub-cache-dirUFUDSJ/hosted/pub.dartlang.org/collection-1.14.11/lib/collection.dart:1:1) referred to by dart.pkg.collection.wrappers: (file:///tmp/pub-cache-dirUFUDSJ/hosted/pub.dartlang.org/collection-1.14.11/lib/wrappers.dart:7:9) warning: ambiguous reexport of dart-ui.hashList, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.hashList: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/hash_codes.dart:114:5) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) Use {@canonicalFor dart:ui.hashList} in the desired library's documentation to resolve the ambiguity and/or override dartdoc's decision, or structure your package so the reexport is less ambiguous. The symbol will still be referenced in all candidates -- this only controls the location where it will be written and which library will be displayed in navigation for the relevant pages. The flag --ambiguous-reexport-scorer-min-confidence allows you to set the threshold at which this warning will appear. warning: ambiguous reexport of dart-ui.hashValues, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.hashValues: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/hash_codes.dart:42:5) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.VoidCallback, canonicalization candidates: (cupertino, foundation, material, painting, rendering, scheduler, widgets) -> widgets (confidence 0.000) from dart-ui.VoidCallback: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/window.dart:8:9) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) foundation: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) scheduler: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.AccessibilityFeatures, canonicalization candidates: (rendering, semantics) -> semantics (confidence 0.000) from dart-ui.AccessibilityFeatures: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/window.dart:1208:7) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) semantics: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.FontWeight, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.FontWeight: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:17:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.Locale, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.Locale: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/window.dart:248:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.Offset, canonicalization candidates: (cupertino, gestures, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.Offset: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/geometry.dart:119:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) gestures: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.Radius, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.Radius: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/geometry.dart:895:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.Rect, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.Rect: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/geometry.dart:621:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.RRect, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.RRect: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/geometry.dart:1018:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.RSTransform, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.RSTransform: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/geometry.dart:1645:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.Size, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.Size: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/geometry.dart:347:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextBox, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.TextBox: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:1220:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextDecoration, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.TextDecoration: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:358:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextPosition, canonicalization candidates: (cupertino, material, painting, rendering, services, widgets) -> widgets (confidence 0.000) from dart-ui.TextPosition: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:1364:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) services: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextRange, canonicalization candidates: (cupertino, material, painting, rendering, services, widgets) -> widgets (confidence 0.000) from dart-ui.TextRange: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:1410:7) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) services: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.AppLifecycleState, canonicalization candidates: (cupertino, material, scheduler, widgets) -> widgets (confidence 0.000) from dart-ui.AppLifecycleState: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/window.dart:154:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) scheduler: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.Brightness, canonicalization candidates: (cupertino, material, services) -> services (confidence 0.000) from dart-ui.Brightness: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/window.dart:1272:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) services: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.FontStyle, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.FontStyle: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:8:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.PlaceholderAlignment, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.PlaceholderAlignment: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:1619:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextAffinity, canonicalization candidates: (cupertino, material, painting, rendering, services, widgets) -> widgets (confidence 0.000) from dart-ui.TextAffinity: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:1322:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) services: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextAlign, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.TextAlign: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:317:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextBaseline, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.TextBaseline: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:349:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextDecorationStyle, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.TextDecorationStyle: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:417:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: ambiguous reexport of dart-ui.TextDirection, canonicalization candidates: (cupertino, material, painting, rendering, widgets) -> widgets (confidence 0.000) from dart-ui.TextDirection: (file:///flutter/bin/cache/pkg/sky_engine/lib/ui/text.dart:1208:6) cupertino: 1.010 - embeds package name (+1.000), name is long (+0.01000) material: 1.010 - embeds package name (+1.000), name is long (+0.01000) painting: 1.010 - embeds package name (+1.000), name is long (+0.01000) rendering: 1.010 - embeds package name (+1.000), name is long (+0.01000) widgets: 1.010 - embeds package name (+1.000), name is long (+0.01000) warning: no canonical library found for base_model_context.BaseModelContext.hashCode, not linking, from base_model_context.BaseModelContext.hashCode: (file:///flutter/bin/cache/pkg/sky_engine/lib/core/object.dart:94:20) warning: no canonical library found for base_model_context.BaseModelContext.runtimeType, not linking, from base_model_context.BaseModelContext.runtimeType: (file:///flutter/bin/cache/pkg/sky_engine/lib/core/object.dart:116:21) warning: no canonical library found for base_model_context.BaseModelContext.noSuchMethod, not linking, from base_model_context.BaseModelContext.noSuchMethod: (file:///flutter/bin/cache/pkg/sky_engine/lib/core/object.dart:111:20) warning: no canonical library found for base_model_context.BaseModelContext.toString, not linking, from base_model_context.BaseModelContext.toString: (file:///flutter/bin/cache/pkg/sky_engine/lib/core/object.dart:99:19) warning: no canonical library found for base_model_context.BaseModelContext.==, not linking, from base_model_context.BaseModelContext.==: (file:///flutter/bin/cache/pkg/sky_engine/lib/core/object.dart:62:26) warning: no canonical library found for duplicate_field_error.DuplicateFieldError.stackTrace, not linking, from duplicate_field_error.DuplicateFieldError.stackTrace: (file:///flutter/bin/cache/pkg/sky_engine/lib/core/errors.dart:94:27) warning: flutter_pom has no library level documentation comments, from flutter_pom: (file:///tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/model/table.dart:29:9) warning: flutter_pom has no library level documentation comments, from flutter_pom: (file:///tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/flutter_pom.dart:29:9) error: failed to write file at: flutter_pom/flutter_pom-library.html for symbol flutter_pom: (file:///tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/flutter_pom.dart:29:9) conflicting with file already generated by flutter_pom: (file:///tmp/pub-dartlang-dartdocAZJHSM/pkg/lib/model/table.dart:29:9) Dartdoc generates a path and filename to write to for each symbol. flutter_pom conflicts with another symbol in the generated path, and therefore can not be written out. Changing the name, library name, or class name (if appropriate) of one of the conflicting items can resolve the conflict. Alternatively, use the @nodoc tag in one symbol's documentation comments to hide it. found 36 warnings and 1 error Unhandled exception: dartdoc encountered 1 errors while processing. #0 Dartdoc.generateDocs (package:dartdoc/dartdoc.dart:202:7)

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=2.6.0 <3.0.0
crypto ^2.1.3 2.1.4
flutter 0.0.0
intl ^0.16.0 0.16.1
logger ^0.8.3 0.8.3
sqflite ^1.2.0 1.3.0
Transitive dependencies
charcode 1.1.3
collection 1.14.11 1.14.12
convert 2.1.1
io 0.3.4
meta 1.1.8
path 1.6.4
sky_engine 0.0.99
source_span 1.7.0
sqflite_common 1.0.0+1
string_scanner 1.0.5
synchronized 2.2.0
term_glyph 1.1.0
typed_data 1.1.6
vector_math 2.0.8
Dev dependencies
flutter_test
matcher any