You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter状态管理与Provider使用:如何通过Provider控制车轮列表索引切换

Flutter Provider 状态接入操作步骤

你编写的WheelCounter逻辑是对的,仅需要补充状态变更通知,再按以下步骤接入组件树即可:

1. 补全WheelCounter状态类

在状态修改方法末尾添加notifyListeners(),通知所有监听该状态的组件更新:

import 'package:flutter/material.dart';

class WheelCounter with ChangeNotifier {
  int _count = 0;
  // 暴露当前索引给组件读取
  int get count => _count;
  
  void wheel1Choose() {
    _count = 0;
    notifyListeners();
  }
  void wheel2Choose() {
    _count = 1;
    notifyListeners();
  }
}

2. 在根组件注入Provider实例

修改main.dart,将WheelCounter实例注入到组件树顶层,让所有子组件都能访问到状态:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import './car.dart';
import './buttons.dart';
import './wheel_counter.dart'; // 引入你写的WheelCounter文件

void main() => runApp(
  ChangeNotifierProvider(
    create: (context) => WheelCounter(),
    child: MyApp(),
  )
);

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            SizedBox(height: 50),
            Car(),
            SizedBox(height: 50),
            Buttons(),
          ],
        ),
      ),
    );
  }
}

3. Car组件读取状态控制车轮显示

修改car.dart,移除硬编码的索引0,从Provider中读取当前选中的索引:

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

class Car extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return CarState();
  }
}

class CarState extends State<Car> {
  final wheelImage = [
    Image.asset('assets/wheel1.png'),
    Image.asset('assets/wheel2.png'),
  ];

  @override
  Widget build(BuildContext context) {
    // 监听状态变化
    final wheelCounter = Provider.of<WheelCounter>(context);
    return Stack(
      children: [
        Image.asset('assets/golf.png'), // 车身
        wheelImage[wheelCounter.count], // 动态切换车轮
      ],
    );
  }
}

4. Buttons组件绑定点击事件修改状态

修改buttons.dart,点击按钮时调用WheelCounter的方法修改状态:

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

class Buttons extends StatelessWidget {
  const Buttons({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          // 修改状态时不需要监听状态变化,listen设为false
          onPressed: () => Provider.of<WheelCounter>(context, listen: false).wheel1Choose(),
          child: Text('Wheel 1')
        ),
        SizedBox(width: 20),
        ElevatedButton(
          onPressed: () => Provider.of<WheelCounter>(context, listen: false).wheel2Choose(),
          child: Text('Wheel 2')
        ),
      ],
    );
  }
}

注意:Dart语法规范要求类名使用大驼峰命名,原代码中的小写car类名建议修改为Car,避免后续出现语法识别问题。

内容的提问来源于stack exchange,提问作者Corden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:03