#flutter #dart
Вопрос:
Я хочу знать, как отправлять данные в другой класс.
Импортированный из данных gRPC,список преобразуется в строку и отправляет класс домашней страницы
Наконец, я хочу выразить данные, которые были импортированы в сообщении чата.
Я скопировал его с YouTube, поэтому у меня недостаточно кода.
class Client{
var ro;
var de = Int64.parseRadix('24A16057F615', 16);
var gw;
List<int> da;
ExProtoClient stub = ExProtoClient(
ClientChannel('172.22.144.1', port: 5054,
options: const ChannelOptions(
credentials: ChannelCredentials.insecure())
));
final box = new ExMessage();
Future<ExMessage> sendMessage() async {
await stub.exClientstream(box
..gwId = 0x51894B30
..route = 1835139072
..dataUnit = [0x01, 0x03, 0x00, 0x65, 0x00, 0x28, 0xAD, 0xDE]
..deviceId = de
);
return(box);
}
Future<ExMessage> receiveMessage() async {
var request = ExMessage();
await stub.exServerstream(request).listen((response) {
if (response.dataUnit != null){
ro = response.route;
da = response.dataUnit;
de = response.deviceId;
gw = response.gwId;
rxMtu(ro, gw, de, da);
}
else{
print('wating');
}
});
}
void rxMtu(int gwGroup, int gwId, Int64 deviceId, List payload)
{
String data = payload.join('-');
print(data);
}
}
Это класс для отправки данных
Я хочу отправить переменные данные из rxMtu.
class HomePage extends StatefulWidget {
@override
HomePageState createState() => new HomePageState();
static HomePageState of(BuildContext context) =>
context.findAncestorStateOfType<HomePageState>();
}
class HomePageState extends State<HomePage> {
var client = Client();
//TextEditor
TextEditingController _TextEditingController = TextEditingController();
List<ChatMessage> _chats = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("gRPC on Flutter"),
),
body: Column(
children: [
Expanded(
child: ListView.builder(
reverse: true,
itemBuilder: (context, index){
return _chats[index];
},
itemCount: _chats.length,
)),
Container(
padding: EdgeInsets.only(left: 8.0, right: 8.0),
child: Row(
children: [
Expanded(
child: TextField(
controller: _TextEditingController,
decoration: InputDecoration(hintText: "Send Message"),
onSubmitted: (String text){
_handleSubmitted(text);
},
),
),
SizedBox(
width: 8.0,
),
FlatButton(onPressed: (client.sendMessage)
, child: Text("Send"), color: Colors.greenAccent,),
],
),
),
],
),
);
}
void _handleSubmitted(String text){
Logger().d(text);
_TextEditingController.clear();
ChatMessage newChat = ChatMessage(text);
setState(() {
_chats.insert(0, newChat);
});
}
}
Это класс для получения данных
Я хочу отправить данные в функцию _handleSubmitted
class ChatMessage extends StatelessWidget {
final String txt;
const ChatMessage(this.txt,{Key key,}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8),
child: Row(children: [
CircleAvatar(
backgroundColor: Colors.blueGrey,
child: Text("Data"),
),
SizedBox(width: 16,),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Payload",
style: TextStyle(fontWeight:FontWeight.bold ),
),
Text(txt),
],
)
)
],
),
);
}
}
это класс ChatMessage
Спасибо, что прочитали это.
Ответ №1:
Я не уверен в вашей проблеме, но если вам нужен класс, который делится данными и методами с другими классами или виджетами, вам нужно использовать управление состоянием, например, поставщик, Блок или т. Д. Я предлагаю использовать провайдера следующим образом:
- сначала добавьте его в файл pubspec.yaml (раздел зависимостей)
provider: ^4.0.1
- создайте свой класс
class MessageModel extends ChangeNotifier {
// define your variables and methods
}
- добавьте поставщика на свою главную страницу
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => MessageModel(),
child: MyApp(),
),
);
}
- используйте каждый метод или переменную везде, где захотите
Provider.of<MessageModel>(context, listen: false).NamOfYourMehto();
Я надеюсь, что это может быть полезно.