async_loader icon indicating copy to clipboard operation
async_loader copied to clipboard

Null-Safety

Open napoettker opened this issue 3 years ago • 1 comments

Any plans to migrate this package to null-safety soon?

napoettker avatar Apr 15 '21 20:04 napoettker

Since this project appears to be abandoned, I'll share what I did to replace usages in my project and unblock my null safety migration:

Before:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(builder: (BuildContext context) {
        return AsyncLoader(
          initState: () => myInitState(),
          renderLoad: () => const Center(child: CircularProgressIndicator()),
          renderError: ([dynamic error]) => const Text('Error!'),
          renderSuccess: ({dynamic data}) => getView(context, data),
        );
      }),
    );
  }

After:

  Future<MyData> _myInitState;

  @override
  void initState() {
    super.initState();
    _myInitState = myInitState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Builder(builder: (BuildContext context) {
        return FutureBuilder<MyData>(
          future: _myInitState,
          builder: (BuildContext context, AsyncSnapshot<MyData> snapshot) {
            if (snapshot.hasError) {
              return const Text('Error!');
            } else if (snapshot.hasData) {
              return getView(context, snapshot.data!);
            } else {
              return const Center(child: CircularProgressIndicator());
            }
          }
        );
      }),
    );
  }

To trigger a reload, you can also replace:

final GlobalKey<AsyncLoaderState> _asyncLoaderState = GlobalKey<AsyncLoaderState>();

_asyncLoaderState.currentState.reloadState();

With a simple call to:

setState(() {});

westy92 avatar Aug 03 '21 21:08 westy92