Flutter - Как получить контекст, когда не в классе с методом сборки - PullRequest
0 голосов
/ 28 мая 2020

Я пишу код для PaginatedDataTable, но теряюсь, когда пытаюсь использовать showDialog (). Я хочу, чтобы когда пользователь нажимал строку в DataTable, появлялось диалоговое окно с информацией, содержащейся в этой строке. Проблема, с которой я столкнулся, - это контекст для диалогового окна, потому что он требует контекста, а класс DataRow изначально не имеет контекста.

Чтобы распознать, что строка была выбрана, у вас есть использовать onSelectChanged () в классе DataRow. Здесь я пытаюсь вызвать диалоговое окно, но мне нужно использовать клавишу глобального навигатора.

class CalendarResultsDataSource extends DataTableSource {
  final List<CalendarResult> _calendarResults;
  CalendarResultsDataSource(this._calendarResults);


  @override
  DataRow getRow(int index) {
    assert(index >= 0);
    if (index >= _calendarResults.length) return null;
    final CalendarResult calendarResult = _calendarResults[index];
    return DataRow.byIndex(
        index: index,
        selected: calendarResult.selected,
        onSelectChanged: (bool value) {
          print(value);
          print(calendarResult.agency);
          Dialogs.showAuditInfo(
              navigatorKey.currentState.overlay.context, calendarResult);  //<-- this feels hacky
        },
        cells: <DataCell>[
          DataCell(Container(
              height: double.infinity,
              width: double.infinity,
              color: index.isEven
                  ? ColorDefs.colorAlternatingDark
                  : ColorDefs.colorDarkBackground,
              child: Padding(
                padding: const EdgeInsets.fromLTRB(6.0, 4.0, 4.0, 4.0),
                child: Center(
                    child: Text('${calendarResult.getDateFormatted()}',
                        style: ColorDefs.textBodyWhite15)),
              ))), etc. etc.

        ]);

в классе dataRow.

Итак, я создал клавишу навигатора в main () вот так:

final navigatorKey = GlobalKey<NavigatorState>();

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey,
      home: Scaffold(body: AwesomeAppCodeHere())
    );
  }
}

Затем я имею в виду этот ключ в методе onSelectChanged () следующим образом:

showDialog<void>(
      context: navigatorKey.currentState.overlay.context,
      builder: (BuildContext context) {
        return AlertDialog(
          content: StatefulBuilder(
            builder: (BuildContext context, StateSetter setState) {
              return DialogInnards();
            },
          ),
        );
      },
    );

Но это кажется хакерским. Единственное другое решение, которое я могу придумать, - это передать контекст в класс DataRow из виджета PaginatedDataTable, но тогда мне пришлось бы напрямую изменить виджет Flutter DataRow.

Итак, как лучше всего получить контекст в классе без открытого контекста?

Я видел пакет 'get': может сработать ... https://pub.dev/packages/get, но разве это не излишек для чего-то простого? (но просто убегает от меня?)

...