У меня проблема в том, что, хотя я успешно обновляю значение моего виджета метра (FlutterGauge) через setState, сам виджет не отражает это изменение. Я знаю, что восстановление происходит, и что значение в виджете счетчика действительно обновляется.


void updateScore(bool isOnTopic) {
    //for the purposes of testing we won't use isOnTopic (its a hardcoded true anyway)
    setState(() {
      meterScore += 15;
    });
    print("Score Updated:");
    print("--------" + meterScore.toString() + "--------");
  }

  @override
  Widget build(BuildContext context) {
    print('+++++++We\'re building! Using this.meterScore value: ' +
        meterScore.toString() +
        '+++++++');

    //Replacing my FlutterGauge and return with the line below as a way to isolate the FlutterGauge widget as the problem
    //return Center(child: Text(this.meterScore.toString()));

    FlutterGauge meter = new FlutterGauge(
        circleColor: meterColor,
        secondsMarker: SecondsMarker.none,
        hand: Hand.short,
        number: Number.none,
        width: 200,
        index: meterScore,
        fontFamily: "Iran",
        counterStyle: TextStyle(color: Colors.black, fontSize: 35),
        counterAlign: CounterAlign.center,
        isDecimal: false);
    print("------------Accessing meter.index: " +
        meter.index.toString() +
        "----------------");
    return meter;
  }

Я совершенно уверен, что проблема заключается в том, как я использую виджет FlutterGauge из пакета flutter_gauge, потому что, когда я заменяю его простым текстовым виджетом и передаю ему свое значение, он будет обновляться и отражать обновление, как и ожидалось.

В этом случае вот ссылка на flutter_gauge для справки: https://pub.dev/packages/flutter_gauge#-readme-tab-

Я довольно плохо знаком с флаттером, и это мой первый вопрос о переполнении стека, поэтому извиняюсь, если я совершаю какие-либо очевидные ошибки. Заранее спасибо!

На случай, если я пропущу важный код, который вам, возможно, понадобится увидеть, вот весь файл:

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_gauge/flutter_gauge.dart';

class Meter extends StatefulWidget {
  Meter({Key key}) : super(key: key);
  MeterState createState() => MeterState();
}

class MeterState extends State<Meter> {
  @override
  initState() {
    super.initState();
  }

  double meterScore = 75;
  Color meterColor = Colors.green;

  void updateMeterColor() {
    setState(() {
      meterColor = Colors.green;
    });
  }

  void updateScore(bool isOnTopic) {
    //for the purposes of testing we won't use isOnTopic (its a hardcoded true anyway)
    setState(() {
      meterScore += 15;
    });
    print("Score Updated:");
    print("--------" + meterScore.toString() + "--------");
  }

  @override
  Widget build(BuildContext context) {
    print('+++++++We\'re building! Using this.meterScore value: ' +
        meterScore.toString() +
        '+++++++');

    //Replacing my FlutterGauge and return with the line below as a way to isolate the FlutterGauge widget as the problem
    //return Center(child: Text(this.meterScore.toString()));

    FlutterGauge meter = new FlutterGauge(
        circleColor: meterColor,
        secondsMarker: SecondsMarker.none,
        hand: Hand.short,
        number: Number.none,
        width: 200,
        index: meterScore,
        fontFamily: "Iran",
        counterStyle: TextStyle(color: Colors.black, fontSize: 35),
        counterAlign: CounterAlign.center,
        isDecimal: false);
    print("------------Accessing meter.index: " +
        meter.index.toString() +
        "----------------");
    return meter;
  }

  @override
  void dispose() {
    print("---------We are disposing (as intended)------------");
    super.dispose();
  }
}

РЕДАКТИРОВАТЬ: вот мой терминал после горячего перезапуска и первоначального посещения:

I/flutter (11573): +++++++We're building! Using this.meterScore value: 75.0+++++++
I/flutter (11573): ------------Accessing meter.index: 75.0----------------
I/flutter (11573): 75.0

Вызывая функцию один раз:

I/flutter (11573): Score Updated:
I/flutter (11573): --------90.0--------
I/flutter (11573): +++++++We're building! Using this.meterScore value: 90.0+++++++
I/flutter (11573): ------------Accessing meter.index: 90.0----------------

Я обновил фрагменты кода (удалил this. Из всех meterScore, добавил комментарий к неиспользуемому аргументу функции)

Вероятно, я должен упомянуть, что функция updateScore вызывается вне файла. Как я уже сказал, сама функция работает нормально, как указывают операторы print.

Вот где я использую виджет (это весь файл):

class RecordingPage extends StatefulWidget {
  RecordingPage({Key key}) : super(key: key);

  _RecordingPageState createState() => _RecordingPageState();
}

class _RecordingPageState extends State<RecordingPage> {
  final GlobalKey<MeterState> meterState = GlobalKey<MeterState>();
  int yes = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        floatingActionButton: Container(
            width: this.yes * 10.0,
            child: FittedBox(
                child: FloatingActionButton(
              onPressed: null,
              backgroundColor: Colors.white,
            ))),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
        backgroundColor: Colors.white,
        appBar: offTopTitle,
        body: Column(
          children: <Widget>[
            Row(children: [
              Expanded(
                child: FlatButton(
                  child: Text("Go To Websocket"),
                  color: Colors.blue,
                  onPressed: () {
                    Navigator.pushNamed(context, WebsocketRoute);
                  },
                ),
              ),
            ]),
            Container(
              height: MediaQuery.of(context).size.height / 4,
              child: Image.asset('assets/placeholderWave.gif'),
            ),
            Container(
              margin: EdgeInsets.only(top: 5),
              height: MediaQuery.of(context).size.height / 4,
              child: Meter(key: meterState),
            ),
            Recorder((isOnTopic) {
              meterState.currentState.updateScore(isOnTopic);
            }),
          ],
        ),
        bottomNavigationBar: AppBarBuilder());
  }
}
4
auhbz 25 Апр 2020 в 08:38

2 ответа

Лучший ответ

После игры с пакетом в новом флаттерном проекте я не смог обновить его после создания, используя множество различных способов, и после просмотра всей доступной документации для пакета в настоящее время, я не уверен, что он предназначен для использования в этом случае. Нет примеров изменения датчика после его построения, поэтому он кажется неизменным виджетом.

Я немного покопался, и syncfusion_flutter_gauges выглядит многообещающей альтернативой и в этой статье рассказывается, как делать то, что, по моему мнению, вы пытаетесь сделать в своей проект . Надеюсь, поможет

2
Jwildsmith 28 Апр 2020 в 05:38

Я думаю, что нашел решение. Это сработало для меня. Откройте flutter_gauge.dart и удалите весь закомментированный раздел. Переустановите приложение и обновите данные. Этот шаг работает для меня.

0
Hanis 14 Июн 2020 в 14:09