【问题标题】:flutter - using provider to change font size globally颤振 - 使用提供者全局更改字体大小
【发布时间】:2020-05-24 08:57:24
【问题描述】:

我正在尝试在我的颤振应用程序中使用提供程序来允许用户更改某些小部件的字体大小。

我正在遵循 github.com/flutter/samples/blob/master/provider_counter/lib/main.dart 中描述的方法,但字体大小没有改变。

我有一个显示加号和减号按钮的 UI 小部件:

import "package:flutter/material.dart";
import './size_controller.dart';
import 'package:provider/provider.dart';


class TypeSize extends StatelessWidget {


  final _standardSize = 20.0;

  @override

  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.all(20.0),
      child: Row(
        children: <Widget>[
          Text(
            "Change type size: ",
            style: TextStyle(fontSize: _standardSize),
          ),
          ButtonTheme(
              minWidth: 50,
              child: RaisedButton(
                onPressed: () {
                  if (_standardSize < 23.0) {
                    Provider.of<FontSizeController>(context, listen: false).increment(_standardSize);
                  }
                },
                child: Text(
                  "+", style: TextStyle(
                    color: Colors.white,
                    fontSize: 30),
                  ),
                color: Colors.green,
              ),
            ),
          ButtonTheme(
            minWidth: 50,
            child: RaisedButton(
              onPressed: () {
                if (_standardSize > 20.0) {
                    Provider.of<FontSizeController>(context, listen: false).decrement(_standardSize);
                }
              },
              child: Text(
                "-", style: TextStyle(
                  color: Colors.white,
                  fontSize: 30,
                  ),
                ),
              color: Colors.green,
            ),
          ),
        ],
      ),
    );
  }
}

FontSizeController 看起来像这样:

import 'package:flutter/material.dart';

class FontSizeController with ChangeNotifier {

  double value = 20.0;

  void increment(value) {
    value ++;
    notifyListeners();
  }

  void decrement(value) {
    value --;
    notifyListeners();
  }

}

最后我要更改的小部件如下所示:

import 'package:flutter/material.dart';
// import 'package:wfa_ambo_bloc/main.dart';
import 'package:provider/provider.dart';
import '../controllers/size_controller.dart';

class Comfort extends StatefulWidget {
  @override
  _ComfortState createState() => _ComfortState();
}

class _ComfortState extends State<Comfort> {

  int _comfortSliderValue = 3;
  // double _standardSize = 20;

  @override

  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(bottom: 40),
      child: Column(
      children: <Widget>[
        Align(
          alignment: Alignment.centerLeft,
          child: ChangeNotifierProvider(
            create: (context) => FontSizeController(),
            child: Container(
              padding: EdgeInsets.all(20.0),
              child: Consumer<FontSizeController>(
                builder: (
                  context, 
                  sizeController, 
                  child) => Text(
                    "How comfortable was your journey?",
                  textAlign: TextAlign.left,
                  style: TextStyle(
                    fontWeight: FontWeight.w400,
                    fontFamily: "Roboto",
                    letterSpacing: 0.5,
                      fontSize: sizeController.value,
                    ),
                  ),
                ),
              ),
            ),
          ),
... etc

单击按钮时什么都没有发生。有人可以帮忙吗?

我试图适应的示例都包含在 main() 中,但我已经分离出我的小部件以尝试使所有内容更清洁 - 这就是造成差异的原因吗?

【问题讨论】:

  • 嘿,伙计,请分享您的代码。我无法更改大小。
  • @Priyank - 当然,但评论中没有空间放置完整代码。怎么分享最好?单击调整大小按钮时会发生什么?

标签: flutter flutter-provider


【解决方案1】:

无需在您的小部件中使用变量(删除_standardSize)。

只需保留 ChangeNotifier 中的值并直接使用它(通过 getter):

import 'package:flutter/material.dart';

class FontSizeController with ChangeNotifier {

  double _value = 20.0;

  int get value => _value;

  void increment() {
    _value++;
    notifyListeners();
  }

  void decrement() {
    _value--;
    notifyListeners();
  }

}

然后在加号和减号按钮上,只需从您的ChangeNotifier 增加或减少值:

// on plus button pressed
Provider.of<FontSizeController>(context, listen: false).increment();

// on minus button pressed
Provider.of<FontSizeController>(context, listen: false).decrement();

最后在您希望调整文本大小的小部件中:

fontSize: Provider.of<FontSizeController>(context, listen: true).value

【讨论】:

  • 投反对票的人请解释一下...这个解决方案已经过测试,效果很好,比使用不必要的变量要好得多。
  • 非常感谢您花时间回答这个问题。我不确定为什么你的回答也被否决了。您不需要传递 _standardSize 变量是对的,而且您的方法似乎与github.com/flutter/samples/blob/master/provider_counter/lib/… 推荐的方法一致。在我的情况下,我必须更改的是 ChangeNotifierProvider 小部件的位置。我因为没有污染范围而分心,并将其放在 UI 问题小部件中而不是 main 中。
  • 确实,如果您使用Provider.of,那么您的ChangeNotifierProvider 必须移动到祖先小部件(可以是主小部件)。我使用Provider.of 来检索我的答案中的值作为示例,但当然,如果您愿意(特别是如果您需要更具体的小部件重建),当然您可以继续使用Consumer,在这种情况下您不需要移动你的ChangeNotifierProvider 主要。这完全取决于您的应用程序结构以及您需要在哪里访问 Provider 数据。
  • @Yann39 我认为听应该是真的:在 fontSize: Provider.of(context, listen: false).value
  • @iamnabink True :)
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 2019-12-08
  • 2021-06-18
  • 2020-05-10
  • 1970-01-01
  • 2023-01-19
  • 2020-12-24
  • 2022-08-19
相关资源
最近更新 更多