Provider2

changenotifierprovider跟單純provider這兩個語法在flutter中有何區別?

ChangeNotifierProvider 和 Provider 在 Flutter 中都是用于状态管理的工具,但它们之间有一些区别。

Provider 是一个通用的提供者,用于在应用程序中共享任何类型的数据。它可以与任何对象一起使用,不仅限于特定的状态管理方式。
ChangeNotifierProvider 是 Provider 的一种特殊形式,专门用于管理继承自 ChangeNotifier 的对象。ChangeNotifier 是 Flutter 中用于管理状态的一种方式,它可以通知依赖它的 Widget 进行更新。
简而言之,ChangeNotifierProvider 是基于 Provider 的一种特殊情况,用于管理需要通知其依赖进行更新的状态对象。

实例示例:

假设你有一个简单的计数器应用程序,你想要管理计数器的状态。

import ‘package:flutter/material.dart’;
import ‘package:provider/provider.dart’;

// 创建一个继承自 ChangeNotifier 的类来管理计数器状态
class Counter extends ChangeNotifier {
int _count = 0;

int get count => _count;

void increment() {
_count++;
notifyListeners(); // 通知依赖进行更新
}
}

void main() {
runApp(
// 使用 ChangeNotifierProvider 来提供 Counter 对象
ChangeNotifierProvider(
create: (context) => Counter(),
child: MyApp(),
),
);
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text(‘计数器应用程序’),
),
body: Center(
// 使用 Consumer 来访问 Counter 对象,并根据其状态更新 UI
child: Consumer(
builder: (context, counter, child) => Text(
‘当前计数:${counter.count}’,
style: TextStyle(fontSize: 24),
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 通过 Provider.of 获取 Counter 对象,并调用其方法
Provider.of(context, listen: false).increment();
},
child: Icon(Icons.add),
),
),
);
}
}
在这个示例中,我们使用了 ChangeNotifierProvider 来提供 Counter 对象,并使用 Consumer 来订阅 Counter 对象的更新。当点击浮动按钮时,计数器的值会增加,并且 UI 会自动更新。

我在什麼情況下用Provider?

你在任何需要在应用程序中共享数据并且需要UI自动更新的情况下都可以使用Provider。Provider可以让UI自动监听数据变化,并在数据发生变化时自动刷新UI。

在什麼情況用ChangeNotifierPrtovider

使用ChangeNotifierProvider的情况是当你需要管理继承自ChangeNotifier的对象,并希望当这些对象的状态发生变化时,自动通知其依赖进行更新。ChangeNotifierProvider是用于与ChangeNotifier一起工作的特殊提供者类,它会自动监听ChangeNotifier对象的变化并刷新相关UI。

請提供一個Provider的範例

以下是一个使用Provider的简单示例:

import ‘package:flutter/material.dart’;
import ‘package:provider/provider.dart’;

// 创建一个数据模型类
class DataModel extends ChangeNotifier {
int _data = 0;

int get data => _data;

// 更新数据的方法
void updateData(int newData) {
_data = newData;
// 通知依赖更新UI
notifyListeners();
}
}

void main() {
runApp(
// 使用Provider包裹整个应用程序
ChangeNotifierProvider(
create: (context) => DataModel(),
child: MaterialApp(
home: MyApp(),
),
),
);
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(‘Provider示例’),
),
body: Center(
child: Consumer(
builder: (context, data, child) {
return Text(
‘当前数据:${data.data}’,
style: TextStyle(fontSize: 24),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 获取DataModel对象,并更新数据
Provider.of(context, listen: false).updateData(42);
},
child: Icon(Icons.add),
),
);
}
}
在这个示例中,我们使用Provider包裹整个应用程序,并创建了一个DataModel类来管理数据。当点击浮动按钮时,数据会更新,并且UI会自动更新以反映最新的数据状态。


Last update : 13 novembre 2024
Created : 13 novembre 2024

Comments

Comments