FutureProvider дает нулевой для слушателя - PullRequest
0 голосов
/ 26 января 2020

Я узнаю, FutureProvider может использоваться, когда модель будет задана как Future. Для инициализации модели необходимо использовать метод init() async, поэтому я попытался FutureProvider. Однако FutureProvider не дал пример модели. Он дал null.

Кроме того, при использовании ChangeNotifierProvider успешно обновляет пользовательский интерфейс, FutureProvider, кажется, не обновляет пользовательский интерфейс при вызове notifyListeners(). 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),
        ),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 27 января 2020

Вы можете использовать ChangeNotifierProvider. Он будет обновлять ваш интерфейс всякий раз, когда вызывается notifyListeners.

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}')
...