Допустим, у меня есть текст и кнопка на главном экране (классе) и showModalBottomSheet в другом классе, при нажатии кнопки основного экрана он запускает showModalBottomSheet, содержащий кнопку, эта кнопка отклонит модальный нижний лист и изменит (обновить UI) текст в главный экран.
Можете ли вы привести пример, как я могу этого добиться? или showModalBottomSheet нельзя использовать в другом классе, когда я хочу обновить пользовательский интерфейс?





Вы можете попробовать этот код, я надеюсь, что это будет полезно
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MainScreen(),
);
}
}
class MainScreen extends StatefulWidget {
@override
_MainScreenState createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
String _displayText = 'Initial Text';
void _updateText(String newText) {
setState(() {
_displayText = newText;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Main Screen'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_displayText),
MaterialButton(
onPressed: () {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return BottomSheetWidget(updateText: _updateText);
},
);
},
child: Text('Show Modal Bottom Sheet'),
),
],
),
),
);
}
}
class BottomSheetWidget extends StatelessWidget {
final Function(String) updateText;
BottomSheetWidget({required this.updateText});
@override
Widget build(BuildContext context) {
return Container(
child: Padding(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
MaterialButton(
onPressed: () {
updateText('Updated Text');
Navigator.pop(context);
},
child: Text('Update Text and Close'),
),
],
),
),
);
}
}
Используя это, вы можете передать что угодно обратно на главный экран.
В вашем случае мы передаем строку
Закройте BottomSheet вот так.
Navigator.of(context).pop("updated text");
На главном экране вы можете получить такое значение.
onPressed: () async {
String? result = await showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return BottomSheetWidget();
},
);
if (result != null) {
print(result); //updated text
}
},