【问题标题】:Why state change error occurs on flutter_riverpod during initialization为什么初始化期间flutter_riverpod出现状态变化错误
【发布时间】:2022-01-03 12:45:15
【问题描述】:
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.

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

【问题讨论】:

    标签: flutter flutter-dependencies


    【解决方案1】:

    您可以使用autoDispose解决问题

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

    对于Future,我更喜欢使用FutureProvider

    更多关于riverpod

    【讨论】:

    • 谢谢,成功了。
    • 嗨,我也遇到了同样的问题。你能解释一下你是怎么得出这个结论的吗?
    • @Selast Lambou 你试过autoDispose吗?
    • 我正在使用库,但我无权访问内部库。另外,我需要在屏幕之间保留提供者的状态。
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 2019-05-08
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2020-12-05
    • 2020-09-04
    相关资源
    最近更新 更多