【问题标题】:FutureProvider gives null to a listenerFutureProvider 将 null 提供给侦听器
【发布时间】:2020-05-11 22:03:10
【问题描述】:

我知道FutureProvider 可以在Future 给出模型时使用。需要通过它的init() async方法来初始化模型,所以我尝试了FutureProvider。但是FutureProvider 没有给出模型的实例。它给了null

此外,在使用 ChangeNotifierProvider 成功更新 UI 时,FutureProvider 在调用 notifyListeners() 时似乎没有更新 UI。 Consumer 给出相同的结果。有什么需要修复的吗?谢谢。

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

class MyModel extends ChangeNotifier {
 int _point = 0;

 int get point => _point;

 set point(int value) {
   if (_point != value) {
     _point = value;
     notifyListeners();
   }
 }

 Future<void> init() async { /* Use await doSomething(); */ }
}

void main() => runApp(
  FutureProvider<MyModel>(
    create: (context) async {
      final model = MyModel();
      await model.init();
      return Future.value(model);
    },
    lazy: false,
    updateShouldNotify: (_, __) => true,
    child: MyHomePage(),
  ), 
);

class MyHomePage extends StatefulWidget {
  @override
 _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    final model = Provider.of<MyModel>(context);
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: Center(
          child: Text(
            '${model.point}',
            style: Theme.of(context).textTheme.display1,
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            model.point++;
          },
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter future flutter-provider


    【解决方案1】:

    您可以使用ChangeNotifierProvider。每当调用 notifyListeners 时,它都会更新您的 UI。

    ChangeNotifierProvider(
      create: (context) => MyModel()..init(), 
      child: MyHomePage(),
    )
    

    如果您在 init 方法中没有做任何事情,实际上不需要调用 init

    如果您的 MyModel 类仅用于单个 int 值,您甚至不需要使用它。您可以执行以下操作:

    ChangeNotifierProvider<ValueNotifier<int>>(
      create: (context) => ValueNotifier<int>(0),
      child: MyHomePage(),
    );
    

    在您的主页内

    final counter = Provider.of<ValueNotifier<int>>(context);
    

    您可以在 Text 小部件中使用它,例如:

    Text('${counter.value}')
    

    【讨论】:

    • 好的,当然ChangeNotifierProvider 提供模型并正确更新 UI。但是我需要执行await model.init();,而示例不包含任何真正的初始化。我的问题是为什么示例代码将null 提供给Provider.of&lt;MyModel&gt;(context)ChangeNotifierProvider 在这种情况下不能使用,因为必须提供 Future
    • 因为FutureProvider 监听一个Future,它给出了null(我猜)。您试图避免使用model.init(),对吗?
    • 不行,这种情况下必须执行model.init()
    猜你喜欢
    • 2014-10-25
    • 1970-01-01
    • 2021-09-30
    • 2017-12-31
    • 1970-01-01
    • 2015-12-07
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多