setState() 将调用 build() 方法并使用小部件树进行重建(在底层使用 Flutter 优化),如果您只想构建一部分,则有一个替代方案:创建一个包含您想要的更改的 Provider反映在 UI 中,并用 Consumer 包装该小部件 - 当您从 Provider 调用 notifyListener() 时,只有该小部件将重建。
例如:
child: Consumer<MessageIconStateProvider>(
builder: (context, messageIconProvider, child) {
return Container(
height: 40,
child: messageIconProvider.isShowMessageIcon
? Icon(
Icons.send,
size: 24,
color: Colors.white,
)
: Icon(
Icons.mic_outlined,
size: 24,
color: Colors.white,
),
);
}
)
提供者:
import 'package:flutter/material.dart';
class MessageIconStateProvider with ChangeNotifier {
var isShowMessageIcon = true;
void setIconToMessage(bool setIconToMessage){
if(setIconToMessage != isShowMessageIcon) {
isShowMessageIcon = setIconToMessage;
notifyListeners();
}
}
}
别忘了在你的 main.dart 文件中定义它:
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => MessageIconStateProvider()),
],...