首页 > 解决方案 > 如何重建构建方法

问题描述

单击应用栏中的按钮,它会触发 Controller 类中的 show 方法。在那个 notifyPropertyChangedListeners 触发中,handleControllerValueChange 在 setstate 内将布尔值更改为 true,但它没有触发 build 方法。如何触发构建方法。提前致谢

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

void main() {
  runApp(MyApp());
}

typedef Listener = void Function({String property});

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool value = false;
  Controller controller = Controller();
  @override
  void initState() {
    controller?.addListener(handleControllerValueChange);
    super.initState();
  }

  @override
  void dispose() {
    controller?.removeListener(handleControllerValueChange);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          FlatButton(
            color: Colors.pink,
            onPressed: () {
              controller.show();
            },
          )
        ],
      ),
      body: Center(
        child: Container(
          height: 50,
          width: 50,
          color: Colors.blue,
          child: Text(value.toString()),
        ),
      ),
    );
  }

  void handleControllerValueChange({String property}) {
    if (property == 'show') {
      setState(() {
        value = true;
      });

      value = false;
    }
  }
}

class Controller extends ValueChangeNotifier {
  void show() {
    notifyPropertyChangedListeners(property: 'show');
  }
}

class ValueChangeNotifier {
  Listener listener;
  final ObserverList<Listener> _listeners = ObserverList<Listener>();

  void addListener(Listener listener) {
    _listeners.add(listener);
  }

  void removeListener(Listener listener) {
    _listeners.remove(listener);
  }

  @protected
  void notifyPropertyChangedListeners({String property}) {
    for (listener in _listeners) {
      listener(property: property);
    }
  }
}

标签: flutter

解决方案


我认为构建有效,但我们看不到这一点。您正在调用 setState,然后将值更改为 false。

你能检查你的代码的那部分吗?

 if (property == 'show') {
      setState(() {
        value = true;
      });

      value = false; // delete here and test again.
    }

推荐阅读