面试题答案
一键面试- 创建可被监听的状态对象:
- 首先定义一个继承自
ChangeNotifier
的类,这个类的实例就是我们的状态对象。ChangeNotifier
类提供了通知监听器状态变化的功能。 - 例如,假设我们要创建一个用于计数的状态对象:
- 首先定义一个继承自
import 'package:flutter/foundation.dart';
class CounterModel extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
}
在上述代码中,CounterModel
类继承自 ChangeNotifier
,有一个私有变量 _count
用于存储计数,get count
方法用于获取当前计数值,increment
方法用于增加计数并调用 notifyListeners()
通知所有监听器状态发生了变化。
- 在Widget树中不同层级的Widget间共享该状态:
- 使用
Provider
库,首先需要在pubspec.yaml
文件中添加provider
依赖并运行flutter pub get
。 - 然后在
main.dart
中,通常在应用的顶层使用ChangeNotifierProvider
来提供状态对象。这样,在其下方的所有Widget都可以通过Provider
来获取这个状态对象。
- 使用
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => CounterModel(),
child: MaterialApp(
home: HomePage(),
),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Provider State Management'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<CounterModel>(
builder: (context, model, child) {
return Text('Count: ${model.count}', style: TextStyle(fontSize: 24));
},
),
ElevatedButton(
onPressed: () {
Provider.of<CounterModel>(context, listen: false).increment();
},
child: Text('Increment'),
)
],
),
),
);
}
}
在上述代码中:
ChangeNotifierProvider
的create
回调创建了CounterModel
的实例。Consumer<CounterModel>
是一个Widget,它接受一个builder
回调。在builder
中,model
就是共享的状态对象CounterModel
的实例,我们可以使用它的属性和方法。ElevatedButton
的onPressed
回调中,通过Provider.of<CounterModel>(context, listen: false)
获取CounterModel
实例并调用increment
方法。listen: false
表示我们只是调用方法改变状态,而不关心状态变化的监听(因为按钮点击时不需要重新构建按钮本身)。如果要监听状态变化并根据变化重建Widget,就不需要设置listen: false
。