Использование других функций класса в Flutter

#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:

Я не уверен в вашей проблеме, но если вам нужен класс, который делится данными и методами с другими классами или виджетами, вам нужно использовать управление состоянием, например, поставщик, Блок или т. Д. Я предлагаю использовать провайдера следующим образом:

  1. сначала добавьте его в файл pubspec.yaml (раздел зависимостей)
   provider: ^4.0.1
 
  1. создайте свой класс
 class MessageModel extends ChangeNotifier {
   // define your variables and methods
}
 
  1. добавьте поставщика на свою главную страницу
 void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => MessageModel(),
      child: MyApp(),
    ),
  );
}
 
  1. используйте каждый метод или переменную везде, где захотите
 Provider.of<MessageModel>(context, listen: false).NamOfYourMehto();
 

Я надеюсь, что это может быть полезно.