我想启动一个函数,该函数在MyChangeNotifier更改时返回future .

使用future 的构建器小部件并直接调用该函数可以起作用,但这也会在重建小部件时调用该函数,从而导致对我的函数进行不必要的调用.该函数应该像init函数一样在构建方法之外调用,但仅在MyChangeNotifier更新时才调用.

我没有找到这个问题的解决方案. 在初始化函数中,没有构建上下文来访问MyChangeNotifier并添加监听器.似乎要访问此构建上下文,您需要处于构建方法中,然后每次小部件重建时都会强制调用您.

我想念什么?您有一个优雅的解决方案来解决这个问题吗?

我希望这个speedo代码可以帮助您更好地理解我的问题.

MyChangeNotifier extends ChangeNotifier {
//contains a list of directories that can be updated from anywhere in the app
}

MyWidget extend StatelessWidget { // probably some states are needed
    Widget build(BuildContext context) {
        var myChangeNotifier = Provider.of<MyChangeNotifier>(context);
        return FutureBuilder(future: _computemd5(myChangeNotifier), builder: return Text(futur_result);); // the future is computed every time the build method is called not only when MyChangeNotifier changed.
    }

   future<String> _computemd5(MyChangeNotifier myChangeNotifier) {
    // compute
    }
}

推荐答案

您可以使用StatefulWidgetListenableBuilder的组合.确保您的小部件为StatefulWidget,因为您需要管理状态和生命周期方法.然后,使用ListenableBuilder来收听MyChangeNotifier中的变化.只有当通知器通知其监听器时,此小部件才会重建,这正是您所需要的.

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

class MyWidget extends StatefulWidget {
 @override
 _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
 Future<String>? _futureMd5;

 @override
 void initState() {
    super.initState();
    // Initialize _futureMd5 with a default value or null if not needed
    _futureMd5 = _computemd5(Provider.of<MyChangeNotifier>(context, listen: false));
 }

 @override
 Widget build(BuildContext context) {
    return ListenableBuilder(
      listenable: Provider.of<MyChangeNotifier>(context),
      builder: (context, child) {
        // Trigger _computemd5 only when MyChangeNotifier is updated
        _futureMd5 = _computemd5(Provider.of<MyChangeNotifier>(context, listen: false));
        return FutureBuilder<String>(
          future: _futureMd5,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return CircularProgressIndicator(); // Show loading indicator while waiting
            } else if (snapshot.hasError) {
              return Text('Error: ${snapshot.error}');
            } else {
              return Text(snapshot.data!); // Display the result
            }
          },
        );
      },
    );
 }

 Future<String> _computemd5(MyChangeNotifier myChangeNotifier) async {
    // Your computation logic here
    // For demonstration, let's just return a dummy string after a delay
    await Future.delayed(Duration(seconds: 2));
    return 'MD5 Result';
 }
}

Flutter相关问答推荐

如何更新文本字段的基础上的选定下拉菜单?

为什么他们实例化类,然后丢弃该实例?

我可以在iOS设备上使用Ffltter实现Google Pay按钮吗?

文本未设置在集装箱摆动的中心

如何在凌晨12点显示00:00(24小时格式)而不是在Flutter 中显示24:00

我有一个问题:类型';()=>;Null';不是类型转换中类型';(Int)=>;void';的子类型

在setState之后,Ffltter ListView.Builder未更新

摆动如何更改弹出菜单项高亮显示 colored颜色 半径

Ffltter:发布版本中的Path NotFoundException

ReCAPTCHA Enterprise中的严重安全漏洞

如何从RealmResults获取Flutter Flutter 流?

Flutter 渲染HTML和数学(LaTeX和Katex)

Wired Firebase错误-[CLOUD_FIRESTORE/UNAvailable]该服务当前不可用

Flutter中的编译时间常量方法

StateNotifer正在riverpod中提供初始状态值(bool)

自定义绘画未显示 - Flutter

更改底部导航栏下方 Flutter Snackbar 的位置

具有 BLOC 和存储库模式的 Flutter Workmanager

在 Dart 中使用隔离时访问外部范围内的变量

RangeError(索引):无效值:有效值范围为空:点击文章时为0