1

The generic data type of a GeneratedColumn is always nullable, regardless of whether its definition has nullable() or not. It doesn't even make a difference whether I use TextColumn or Column<String> (and similar). Example:

db.dart:

import 'package:moor/moor.dart';

part 'db.g.dart';

class FooTable extends Table {
  Column<String> get id => text()();

  Column<int> get someNumber => integer()();

  Column<DateTime> get someDate => dateTime()();
}

@UseMoor(tables: <Type>[FooTable])
class Db extends _$Db {
    // ...
}

db.g.dart:

class $FooTableTable extends FooTable with TableInfo<$FooTableTable, FooTableData> {
  final GeneratedDatabase _db;
  final String? _alias;
  $FooTableTable(this._db, [this._alias]);
  final VerificationMeta _idMeta = const VerificationMeta('id');
  late final GeneratedColumn<String?> id = GeneratedColumn<String?>(
      'id', aliasedName, false,
      typeName: 'TEXT', requiredDuringInsert: true);
  final VerificationMeta _someNumberMeta = const VerificationMeta('someNumber');
  late final GeneratedColumn<int?> someNumber = GeneratedColumn<int?>(
      'some_number', aliasedName, false,
      typeName: 'INTEGER', requiredDuringInsert: true);
  final VerificationMeta _someDateMeta = const VerificationMeta('someDate');
  late final GeneratedColumn<DateTime?> someDate = GeneratedColumn<DateTime?>(
      'some_date', aliasedName, false,
      typeName: 'INTEGER', requiredDuringInsert: true);
  @override
  List<GeneratedColumn> get $columns => [id, someNumber, someDate];
  @override
  String get aliasedName => _alias ?? 'foo_table';
  @override
  String get actualTableName => 'foo_table';
  @override
  VerificationContext validateIntegrity(Insertable<FooTableData> instance,
      {bool isInserting = false}) {
    final context = VerificationContext();
    final data = instance.toColumns(true);
    if (data.containsKey('id')) {
      context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta));
    } else if (isInserting) {
      context.missing(_idMeta);
    }
    if (data.containsKey('some_number')) {
      context.handle(
          _someNumberMeta,
          someNumber.isAcceptableOrUnknown(
              data['some_number']!, _someNumberMeta));
    } else if (isInserting) {
      context.missing(_someNumberMeta);
    }
    if (data.containsKey('some_date')) {
      context.handle(_someDateMeta,
          someDate.isAcceptableOrUnknown(data['some_date']!, _someDateMeta));
    } else if (isInserting) {
      context.missing(_someDateMeta);
    }
    return context;
  }

  @override
  Set<GeneratedColumn> get $primaryKey => <GeneratedColumn>{};
  @override
  FooTableData map(Map<String, dynamic> data, {String? tablePrefix}) {
    return FooTableData.fromData(data, _db,
        prefix: tablePrefix != null ? '$tablePrefix.' : null);
  }

  @override
  $FooTableTable createAlias(String alias) {
    return $FooTableTable(_db, alias);
  }
}

The column definition is Column<String> get id => text()().
But the generated column is GeneratedColumn<String?> id.

Is there a way get a GeneratedColumn<String> (aka nullsafe)?

Stacky
  • 875
  • 9
  • 24

0 Answers0