Я пишу код для 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, но разве это не излишек для чего-то простого? (но просто убегает от меня?)