New package: deferred_widget #54

Open
opened 2022-12-03 21:46:14 +00:00 by hugo · 1 comment
Owner

New package to add @deferred annotation on any widget to generate all code for Flutter Web lazy loading

New package to add @deferred annotation on any widget to generate all code for Flutter Web lazy loading
hugo self-assigned this 2022-12-03 22:07:16 +00:00
Author
Owner

Idea:

@Deferred()
class MyWidget extends StatelessWidget {...}

will generate

import 'package:flutter/material.dart';
import 'package:wyatt_deferred_widget_annotation/wyatt_deferred_widget_annotation.dart';
import 'my_widget.dart' deferred as my_widget;

class MyWidgetDeferred extends StatefulWidget {
  const MyWidgetDeferred({
    this.placeholderBuilder,
    super.key,
  });

  final Widget Function(BuildContext context)? placeholderBuilder;

  @override
  State<MyWidgetDeferred> createState() =>
      MyWidgetDeferredState();
}

class MyWidgetDeferredState extends State<MyWidgetDeferred> {
  static bool loaded = false;

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

  Future<void> load() async {
    await my_widget.loadLibrary();
    if (mounted) {
      setState(() {
        loaded = true;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    if (!loaded) {
      if (widget.placeholderBuilder != null) {
        return widget.placeholderBuilder!.call(context);
      }
      if (Deferred.placeholderBuilder != null) {
        return Deferred.placeholderBuilder!.call(context);
      }
      return const SizedBox.shrink();
    }
    return my_widget.MyWidget(
      color: widget.color,
    );
  }
}

Then you can import my_widget.deferred.dart in any file to use it as

MyWidgetDeferred(
   placeholderBuilder: (context) => const LinearProgressIndicator(),
)

You can also define global place-holder like

Deferred.placeholderBuilder = (context) => const CircularProgressIndicator();
runApp(const App());
Idea: ```dart @Deferred() class MyWidget extends StatelessWidget {...} ``` will generate ```dart import 'package:flutter/material.dart'; import 'package:wyatt_deferred_widget_annotation/wyatt_deferred_widget_annotation.dart'; import 'my_widget.dart' deferred as my_widget; class MyWidgetDeferred extends StatefulWidget { const MyWidgetDeferred({ this.placeholderBuilder, super.key, }); final Widget Function(BuildContext context)? placeholderBuilder; @override State<MyWidgetDeferred> createState() => MyWidgetDeferredState(); } class MyWidgetDeferredState extends State<MyWidgetDeferred> { static bool loaded = false; @override void initState() { load(); super.initState(); } Future<void> load() async { await my_widget.loadLibrary(); if (mounted) { setState(() { loaded = true; }); } } @override Widget build(BuildContext context) { if (!loaded) { if (widget.placeholderBuilder != null) { return widget.placeholderBuilder!.call(context); } if (Deferred.placeholderBuilder != null) { return Deferred.placeholderBuilder!.call(context); } return const SizedBox.shrink(); } return my_widget.MyWidget( color: widget.color, ); } } ``` Then you can import `my_widget.deferred.dart` in any file to use it as ```dart MyWidgetDeferred( placeholderBuilder: (context) => const LinearProgressIndicator(), ) ``` You can also define global place-holder like ```dart Deferred.placeholderBuilder = (context) => const CircularProgressIndicator(); runApp(const App()); ```
hugo added the
proposal
label 2023-04-07 11:58:57 +00:00
hugo added the
package
proposal
label 2023-04-07 12:15:29 +00:00
hugo changed title from Proposal(deferred_widget): new package to New package: deferred_widget 2023-04-07 12:15:41 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Wyatt-FOSS/wyatt-packages#54
No description provided.