Flutter/provider-使用构造函数初始化状态

1 flutter flutter-provider

我正在尝试了解提供程序在颤振中的工作原理,但我仍然没有弄清楚如何使用状态的构造函数来初始化状态。有什么建议吗?

这是构造函数正在监视的类

class Counter extends ChangeNotifier{
  int _count;
  
  Counter(int initValue){

  _count=initValue;
  }
  
  void increment() {
    ++_count;
    notifyListeners();
    
  }
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*rry 6

在此输入图像描述

首先,您可以将 ChangeNotifier 简化为:

class Counter extends ChangeNotifier {
  int count;

  Counter(this.count);

  void increment() {
    count++;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

1. 创建您的ChangeNotifierProvider

现在,将您定义ChangeNotifierProvider为:

ChangeNotifierProvider<Counter>(
  create: (context) => Counter(10),
  child: child,
),
Run Code Online (Sandbox Code Playgroud)

您可以在此处提供 的初始值Counter

2.消耗你的ChangeNotifierProvider

ChangeNotifierProvider<Counter>(
  create: (context) => Counter(10),
  child: child,
),
Run Code Online (Sandbox Code Playgroud)

3. 增加你的ChangeNotifier Counter

Consumer<Counter>(
  builder: (context, counter, child) => Text(counter.count.toString()),
Run Code Online (Sandbox Code Playgroud)

在这里,请记住指定您不想听您的提供者的声音。

完整源代码

Provider.of<Counter>(context, listen: false).increment(),
Run Code Online (Sandbox Code Playgroud)

河波德

注意:如果您正在学习Provider,请查看来自同一作者的Riverpod 包Provider。它更简单,模板更少:

这是使用 Hooks Riverpod 的相同示例。

1. 创建您的ChangeNotifierProvider

Provider 只是一个全局变量,存在于ProviderScope我们在MyApp.

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

void main() {
  runApp(
    ChangeNotifierProvider<Counter>(
      create: (context) => Counter(10),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'StackOverflow Answer',
      home: Scaffold(
        body: Center(
          child: Consumer<Counter>(
            builder: (context, counter, child) => Text(
              counter.count.toString(),
              style: TextStyle(fontSize: 96),
            ),
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () =>
              Provider.of<Counter>(context, listen: false).increment(),
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

class Counter extends ChangeNotifier {
  int count;

  Counter(this.count);

  void increment() {
    count++;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

2.消耗你的ChangeNotifierProvider

useProvider使用 Hooks Riverpos,可以在构建方法的开头使用 Provider :

final counterProvider = ChangeNotifierProvider<Counter>((ref) => Counter(10));
Run Code Online (Sandbox Code Playgroud)

3. 增加你的ChangeNotifier Counter

Provider这就像从当前读取BuildContext并调用该方法一样简单increment

final counter = useProvider(counterProvider);
Run Code Online (Sandbox Code Playgroud)
context.read(counterProvider).increment(),
Run Code Online (Sandbox Code Playgroud)