@hubbletvv

Почему виджет многократно билдится при передаче аргументов через Navigator?

Это код с таблицей:
spoiler

import 'package:flutter/material.dart';
    import 'package:csv/csv.dart';
    import 'dart:io';
    
    class ShowTable extends StatefulWidget {
      @override
      _ShowTableState createState() => _ShowTableState();
    }
    
    class _ShowTableState extends State<ShowTable> {
      List<List<dynamic>> data = [];
    
      void _load() async {
        // String linkOfDict = ModalRoute.of(context).settings.arguments;
        String linkOfDict =
            '/data/data/com.example.eng_translator/app_flutter/sales.csv';
    
        String contents = await File(linkOfDict).readAsString();
        data = CsvToListConverter().convert(contents);
    
        setState(() {});
    
        print(data);
      }
    
      @override
          void initState() {
          super.initState();
          _load();
       }

      @override
      Widget build(BuildContext context) {
        // _load();
    
        return Scaffold(
          appBar: AppBar(
            title: Text("Table"),
          ),
          body: SingleChildScrollView(
            child: Table(
              columnWidths: {
                0: FlexColumnWidth(1),
              },
              border: TableBorder.all(width: 1.0),
              children: data.map((item) {
                return TableRow(
                    children: item.map((row) {
                  return Container(
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Text(
                        row.toString(),
                        style: TextStyle(fontSize: 20.0),
                      ),
                    ),
                  );
                }).toList());
              }).toList(),
            ),
          ),
        );
      }
    }


Передача аргумента:
Navigator.pushNamed(context, '/show_table', arguments: linkOfDict);

Когда жестко прописана переменная linkOfDict, то таблица появляется без проблем и print (который print(data);) прописывается один раз в консоли, как и положено. С этим вариантом все в порядке. Но если я задаю linkOfDict не жестко, а получаю через ModalRoute (закоментировано в коде), то получаю следующие ошибки:

E/flutter ( 4289): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: dependOnInheritedWidgetOfExactType<_ModalScopeStatus>() or dependOnInheritedElement() was called before _ShowTableState.initState() completed.
E/flutter ( 4289): When an inherited widget changes, for example if the value of Theme.of() changes, its dependent widgets are rebuilt. If the dependent widget's reference to the inherited widget is in a constructor or an initState() method, then the rebuilt dependent widget will not reflect the changes in the inherited widget.
E/flutter ( 4289): Typically references to inherited widgets should occur in widget build() methods. Alternatively, initialization based on inherited widgets can be placed in the didChangeDependencies method, which is called after initState and whenever the dependencies change thereafter.


Когда метод _load() используется в build(BuildContext context), а не в initState(), то таблица рисуется, но вот print(data) обновляется с большой скоростью. И не имеет значения, linkOfDict прописан жестко или принимается через ModalRoute
  • Вопрос задан
  • 216 просмотров
Решения вопроса 1
@Neonoviiwolf
Flutter developer
setState вызывает перерисовку виджета, соответсвенно вызывается Widget build(BuildContext context), в котором вы снова вызываете перерисовку
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы