我正在使用Riverpod版本2.3.6,在ref.onDisposeAutoDisposeNotifier的情况下有一些问题.

  1. 我已经在内部版本AutoDisposeNotifier中创建了一个AutoDisposeNotifierProvider和一个ref.onDispose函数. 按下"设置文本文本域"按钮将文本设置为文本和文本域,但当"转到屏幕2"时,ref.onDispose函数不会被触发,除非我在"转到屏幕2"处调用ref.invalidate(newStringLabel).AutoDisposeNotifier不是应该自动触发ref.onDispose功能吗?

  2. 我正在使用TextEditingController并试图在ref.onDispose函数中对其进行处置,但收到错误消息"A${notfier.runtimeType}在被处置后被使用.一旦您对${notfier.runtimeType}调用Dispose(),它就不能再使用了."那么我该如何处置TextEditingController美元呢?

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

void main() {
  runApp(const ProviderScope(
    child: MyApp(),
  ));
}

final textController = TextEditingController();

final newStringLabel =
    AutoDisposeNotifierProvider<NewStringLabel, String>(NewStringLabel.new);

class NewStringLabel extends AutoDisposeNotifier<String> {
  @override
  String build() {
    ref.onDispose(() {
      print('Dispose triggered.');
      //textController.dispose();
      textController.clear();
    });
    return "Init text";
  }

  void toCamelCase() {
    state = 'some text from provider';
    print(state);
  }
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const HomeScreen(),
    );
  }
}

class HomeScreen extends ConsumerWidget {
  const HomeScreen({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(
          'Home',
        ),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            Center(
              child: ElevatedButton(
                  onPressed: () {
                    textController.text = 'Set some text to TextField';
                    ref.read(newStringLabel.notifier).toCamelCase();
                  },
                  child: const Text('Set Text TextField')),
            ),
            const SizedBox(height: 10),
            Text(ref.watch(newStringLabel)),
            const SizedBox(height: 10),
            Padding(
              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
              child: TextField(
                controller: textController,
                keyboardType: TextInputType.multiline,
                maxLines: null,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                ),
              ),
            ),
            const SizedBox(height: 10),
            ElevatedButton(
              child: const Text('Goto Screen2'),
              onPressed: () {
                //ref.invalidate(newStringLabel);
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const Screen2()),
                );
              },
            )
          ],
        ),
      ),
    );
  }
}

class Screen2 extends StatelessWidget {
  const Screen2({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Screen2'),
      ),
    );
  }
}

推荐答案

№1.关键是您仍然在小部件树中使用提供程序.要验证这一点,请try 转到如下所示的新页面:

Navigator.pushReplacement(
  context,
  MaterialPageRoute(builder: (context) => const Screen2()),
);

至于问题№2,我建议使用ConsumerStatefulWidget,并使用disposeinitState方法来正确使用和处理您的textController.此外,将其设置为该小部件的一个字段(可以使用late).

Flutter相关问答推荐

壁炉有序在Flutter

如何在不使用NULL-check(!)的情况下缩小`FutureBuilder.Builder()`内部的`Snaphot`范围

自定义ItemBuilderFlutter

在Flutter TextField中计算子字符串位置

为什么Flutter 翼扩展卡有上下边框?

当键盘在抖动中打开时,如何才能看到包装在SingleChildScrollView中的列中的最后一个小工具?

Dart/Flutter 泛型:类型 '(SearchFilterItemModel) => String' 不是类型 '(SearchFilterItemModel) => String' 的子类型

Flutter:使用不包含导航器的上下文请求导航器操作

以编程方式在 flutter 中安装 apk 时解析错误

有没有办法在没有收缩包装的情况下在列中使用 ListView.Builder?

Flutter canvas 绘制不同 colored颜色 的原始点

MediaQuery 在不同手机上不一致

为什么 ref.watch(otherProvider.stream) 在 Riverpod 2.x 中被弃用并且将在 3.x 中被删除?

Flutter sliver 持久化

如何在 flutter 中创建渐变按钮

CircleAvatar 在 ListTile 中领先

出现错误;运算符[]不是为对象类型定义的?功能()'

如何判断 text.contains() 是否包含多个值

这在Flutter 的 pubspec 文件中是什么意思?

Flutter 广告导致延迟