繁体   English   中英

为什么初始化期间flutter_riverpod出现state更改错误

[英]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的新手,我在更改state时注意到了这个错误。

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

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

更多关于河荚

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM