Skip to content

Instantly share code, notes, and snippets.

View eernstg's full-sized avatar

Erik Ernst eernstg

  • Google
  • Aarhus, Denmark
View GitHub Profile
@eernstg
eernstg / stateful_boilerplate_plain.dart
Last active May 14, 2024 21:06
Example from 'Cutting the stateful boilerplate' using likely Dart features (primary constructors, inferred `required`, `override`)
import 'package:flutter/material.dart';
void main() {
runApp(const App(name: 'Dash'));
}
class const App(String name) {
override build(context) {
return MaterialApp(
home: Counter(
@eernstg
eernstg / stateful_boilerplate_macro.dart
Last active May 14, 2024 20:29
Example from 'Cutting the stateful boilerplate' using the proposed macros, such as `@Stateful`
import 'package:flutter/material.dart';
void main() {
runApp(const App(name: 'Dash'));
}
@Stateless()
class App {
@Input() String get name;
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:json/json.dart';
main() async {
const pubUrl = "https://pub.dartlang.org/api/packages/protobuf";
var response = await http.get(Uri.parse(pubUrl));
if (response.statusCode == 200) {
PkgInfo info = PkgInfo.fromJson(json.decode(response.body));
const count = 1000000;
bool b = false;
dynamic top;
void main() {
var sw = Stopwatch();
sw.start();
for (int i = 0; i < count; ++i) {
@eernstg
eernstg / selective_access.dart
Last active January 4, 2024 14:59
Example showing selective access to a private interface using extension types
// Main idea is "same object, different treatment". We create one
// `_Buffer` object and use it as a `WriteBuffer` or as a `ReadBuffer`.
// The two perspectives on the `_Buffer` yield unrelated types,
// different members, even different variance of the type parameter.
// A client _must_ use one or the other extension type, there is no
// way a caller outside this library can directly call any instance
// member of `_Buffer`.
class _Buffer<X> {
X? _value;
import 'dart:async';
typedef BetterCompleter<T> = ({
void Function(T) complete,
void Function(Object, [StackTrace?]) completeError,
bool Function() isCompleted
});
BetterCompleter<T> fromCompleter<T>(Completer<T> c) => (
complete: c.complete,
import 'dart:async';
typedef Inv<X> = X Function(X);
typedef BetterCompleter<X> = _BetterCompleter<X, Inv<X>>;
extension type _BetterCompleter<X, Invariance extends Inv<X>>
.fromCompleter(Completer<X> _) {
void complete(X value) => _.complete(value);
void completeError(Object error, [StackTrace? stackTrace]) =>
_.completeError(error, stackTrace);
@eernstg
eernstg / handle-unstable-flutter-getters.txt
Created November 1, 2023 21:46
List of locations where `avoid_unstable_final_fields` emitted a warning, with a comment on each location about how to handle it.
dev/conductor/core/test/common.dart:79:11
`String? name;` could just as well be `final String? name;`
dev/conductor/core/test/common.dart:82:15
`command` could just as well be `final`
dev/conductor/core/test/common.dart:88:20
Could return `const <String>[]`.
examples/layers/rendering/src/binding.dart:39:18
Could be `late final RenderView _renderView;``
packages/flutter/lib/src/cupertino/route.dart:391:12
`_page` can be stable if `settings` is stable
@eernstg
eernstg / main.dart
Last active October 12, 2023 10:31
class A<X extends A<X>> {}
class B extends A<B> {}
class C extends B {}
void f<X extends A<X>>(X x) {}
void main() {
f<B>(C()); // OK.
f(C()); // Compile-time error: "Couldn't infer ..".
}
@eernstg
eernstg / pkginfo_extension_type.dart
Last active July 28, 2023 16:01
A variant of the 'Dart decoding using dart:convert' example using extension types
import 'package:http/http.dart' as http;
import 'dart:convert';
main() async {
const pubUrl = "https://pub.dartlang.org/api/packages/protobuf";
var response = await http.get(Uri.parse(Uri.encodeFull(pubUrl)));
if (response.statusCode == 200) {
PkgInfo info = PkgInfo(json.decode(response.body));
print('Package ${info.name}, v ${info.latest.pubspec.version}');
} else {