为什么在初始化期间 flutter_riverpod 上发生状态更改错误

Why state change error occurs on flutter_riverpod during initialization

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final dataProvider = StateNotifierProvider<DataNotifier, List<int>>((ref) {
  return DataNotifier();
});

class DataNotifier extends StateNotifier<List<int>> {
  DataNotifier() : super([]);

  Future<void> getData() async {
    state = [];
    await Future.delayed(const Duration(seconds: 2));
    state = [1, 2];
  }
}

void main() => runApp(ProviderScope(child: App()));

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        color: Colors.white,
        child: Center(
          child: ElevatedButton(
            onPressed: () {
              Navigator.of(context).push(
                MaterialPageRoute(builder: (_) => SecondPage()),
              );
            },
            child: const Text('Next page'),
          ),
        ),
      ),
    );
  }
}

class SecondPage extends ConsumerStatefulWidget {
  const SecondPage({Key? key}) : super(key: key);

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

class _SecondPageState extends ConsumerState<SecondPage> {
  @override
  void initState() {
    super.initState();
    ref.read(dataProvider.notifier).getData();
  }

  @override
  Widget build(BuildContext context) {
    final numbers = ref.watch(dataProvider);
    return Scaffold(
      appBar: AppBar(),
      body: ListView.builder(
        itemBuilder: (_, index) {
          return Text('data: $index');
        },
        itemCount: numbers.length,
      ),
    );
  }
}

我是 riverpod 的新手,我在更改状态时注意到这个错误。

在上面的代码中,当我第一次在新开始时点击“下一页”按钮时,它按预期工作但是当我返回并再次点击“下一页”按钮时,如下所示的错误是抛出:

StateNotifierListenerError (At least listener of the StateNotifier Instance of 'DataNotifier' threw an exception
when the notifier tried to update its state.

有谁知道为什么会发生这种情况,我该如何预防。

您可以使用 autoDispose

解决问题
final dataProvider = StateNotifierProvider.autoDispose<DataNotifier, List<int>>(
  (ref) => DataNotifier(),
);

对于Future,我更喜欢使用FutureProvider

更多关于riverpod