Flutter: сборка запланирована во время ошибки кадра с использованием пакета провайдера - PullRequest
0 голосов
/ 07 апреля 2020

Эй, ребята, мне нужна помощь в устранении ошибок, что происходит. Я получаю следующую ошибку (ниже). Я новичок, чтобы трепетать, и любая помощь будет оценена. Что я пытаюсь сделать здесь, так это то, что каждый раз, когда кто-то дважды щелкает мышью по графику (используя функцию перекрестия), он создает новую точку данных и повторно рисует aws диаграмму. Спасибо!

Ошибка: ════════ Исключение обнаружено библиотекой фонда ═════════════════════════ ══════ Следующее утверждение было выдано при отправке уведомлений для PlotData: Построение запланировано во время кадра. Пока дерево виджетов строилось, планировалось и раскрашивалось, планировалось создать новый фрейм для перестройки дерева виджетов.

Весь мой код:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:syncfusion_flutter_charts/charts.dart';

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

class MyApp extends StatelessWidget {
// This tokwidget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => PlotData()),
      ],
      child: Consumer<PlotData>(builder: (context, plotData, _) {
        return MaterialApp(
          home: FirstPage(),
        );
      }),
    );
  }
}

class SalesData {
  SalesData(this.year, this.sales);
  final String year;
  final double sales;
}

class PlotData extends ChangeNotifier {
  List<SalesData> data = [
    SalesData('Jan', 35),
    SalesData('Feb', 28),
    SalesData('Mar', 34),
    SalesData('Apr', 32),
    SalesData('May', 40)
  ];
  void addData(List selectedPoint) {
    print("Current Length of data: " + data.length.toString());
    List<SalesData> addPoint = [
      SalesData(selectedPoint[0], double.parse(selectedPoint[1]))
    ];
    data = data + addPoint;
    print("Now Data has Length of: " + data.length.toString());
    notifyListeners();
  }

  List<SalesData> get allData => data;
}

class VolumeChart extends StatelessWidget {
// Holds the selected points by the user
  List selectedPoint = [];
//VolumeChart(this.data);
  @override
  Widget build(BuildContext context) {
    return SfCartesianChart(
      onCrosshairPositionChanging: (CrosshairRenderArgs args) {
// Crosshair calls this function twice, once for the x,y values respectively
// we capture the full data point string in a list that empties itself when new points are selected
        if (selectedPoint.length == 2) {
          selectedPoint = [];
        }
        selectedPoint.add(args.value); // save the coordinates of the point
// @TODO delete this later, used for prinitng coordinates
        if (selectedPoint.length == 2) {
          Provider.of<PlotData>(context, listen: false).addData(selectedPoint);
//print(selectedPoint.toString());
        }
      },
// Enables the tooltip for all the series in chart
      crosshairBehavior: CrosshairBehavior(
          activationMode: ActivationMode.doubleTap, enable: true),
// Initialize category axis
      primaryXAxis: CategoryAxis(),
      series: <ChartSeries>[
// Initialize line series
        LineSeries<SalesData, String>(
// Enables the tooltip for individual series
            enableTooltip: true,
            dataSource: Provider.of<PlotData>(context, listen: true).allData,
            xValueMapper: (SalesData sales, _) => sales.year,
            yValueMapper: (SalesData sales, _) => sales.sales),
      ],
    );
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        VolumeChart(),
      ],
    );
  }
}

1 Ответ

0 голосов
/ 07 апреля 2020

Вам не нужно вызывать экземпляр поставщика с listen: true, потому что это значение по умолчанию.

Я рекомендую вам не использовать consumer в качестве прямого потомка MaterialApp и делать это вместо этого;

class MyApp extends StatelessWidget {
// This tokwidget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => PlotData()),
      ],
      child:  MaterialApp(
          home: FirstPage.create(context),

      }),
    );
  }
}

Затем реализовать FirstPage следующим образом;

class FirstPage extends StatelessWidget {
   final PlotData plotData; 
   FirstPage({@required this.plotData});

  static Widget create(BuildContext context){
       final plotDataInstant = Provider.of<PlotData>(context, listen: false);
       return FirstPage(plotData: plotDataInstant);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        VolumeChart(),
      ],
    );
  }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...