不必要的容器,但我需要这个容器? flutter/Dart

unnecessary container but I need this container? flutter/Dart

我正在开发一个应用程序,我从 ESP32 获取数据并将其显示在一个简单的页面上。这是我的传感器页面代码:

import 'dart:async';
import 'dart:convert' show utf8;

import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';

class sensorpage extends StatefulWidget {
  const sensorpage({Key? key, required this.device}) : super(key: key);
  final BluetoothDevice device;

  @override
  _sensorpageState createState() => _sensorpageState();
}

class _sensorpageState extends State<sensorpage> {
  final String SERVICE_UUID = "edb91e04-3e19-11ec-9bbc-0242ac130002";
  final String CHARACTERISTIC_UUID = "edb920c0-3e19-11ec-9bbc-0242ac130002";
  late bool isReady;
  //String val1 = "";
  //int pot1 = 0;
  FlutterBlue flutterBlue = FlutterBlue.instance;
  //late StreamSubscription<ScanResult> scanSubScription;
  //late BluetoothDevice targetDevice;
  late Stream<List<int>> stream;
  @override
  void initState() {  
    super.initState();
    isReady = false;
    connectToDevice();
  }

  connectToDevice() async {
    if (widget.device == null) {
      _Pop();
      return;
    }

    Timer(const Duration(seconds: 15), () {
      if (!isReady) {
        disconnectFromDevice();
        _Pop();
      }
    });

    await widget.device.connect();
    discoverServices();
  }

  disconnectFromDevice() {
    if (widget.device == null) {
      _Pop();
      return;
    }

    widget.device.disconnect();
  }

  discoverServices() async {
    if (widget.device == null) {
      _Pop();
      return;
    }

    List<BluetoothService> services = await widget.device.discoverServices();
    services.forEach((service) {
      if (service.uuid.toString() == SERVICE_UUID) {
        service.characteristics.forEach((characteristic) {
          if (characteristic.uuid.toString() == CHARACTERISTIC_UUID) {
            characteristic.setNotifyValue(!characteristic.isNotifying);
            stream = characteristic.value;

            setState(() {
              isReady = true;
            });
          }
        });
      }
    });

    if (!isReady) {
     _Pop();
    }
  }


  Future<bool> _onWillPop() async {
    bool shouldPop = false;
    await showDialog(
        context: context,
        builder: (context) =>
            AlertDialog(
              title: const Text('Are you sure?'),
              content: const Text('Do you want to disconnect device and go back?'),
             actions: <Widget>[
                ElevatedButton(
                    onPressed: () {
                      // shouldPop is already false
                    },
                    child: const Text('No')),
                ElevatedButton(
                    onPressed: () async {
                      await disconnectFromDevice();
                      Navigator.of(context).pop();
                      shouldPop = true;
                    },
                    child: const Text('Yes')),
              ],
            ));
    return shouldPop;
  }

  _Pop() {
    Navigator.of(context).pop(true);
  }

  String _dataParser( List<int> dataFromDevice) {
   return utf8.decode(dataFromDevice);
  }
  @override
  Widget build(BuildContext context) {
    return  WillPopScope(
      onWillPop: _onWillPop,
       child: Scaffold(
        appBar: AppBar(
          title: const Text('Test'),
        ),
        body: Container(
            child: !isReady
                ? const Center(
                    child: Text(
                      "Waiting...",
                      style: TextStyle(fontSize: 24, color: Colors.red),
                    ),
                  )
      
                : Container(
                    child: StreamBuilder<List<int>>(
                  stream: stream,
                  builder: (BuildContext context,
                      AsyncSnapshot<List<int>> snapshot) {
                    if (snapshot.hasError){
                      return Text('Error: ${snapshot.error}');
                    }
                    
                    if (snapshot.connectionState == ConnectionState.active) {
                      var currentValue = _dataParser (snapshot.data!);

                      //val1 = currentValue.split(',')[0];
                      //pot1 = int.parse(val1);


                      return Center(
                          child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget>[
                        const Text('Current value',
                                      style: TextStyle(fontSize: 14)),
                                  Text('${currentValue} jawool',
                                      style: const TextStyle(
                                          fontWeight: FontWeight.bold,
                                          fontSize: 24))
                                ])
                          );
                    } else {
                      return const Text('Check the stream');
                    }
                  },
                )),
        )
        ));
    
  }
}´

我的问题是我显示数据的第二个容器显示为不需要,但我不知道为什么。

我猜你指的是这段代码?

body: Container(
            child: !isReady
                ? const Center(
                    child: Text(
                      "Waiting...",
                      style: TextStyle(fontSize: 24, color: Colors.red),
                    ),
                  )
      
                : Container(
                    child: StreamBuilder<List<int>>(

如果isReadytrue你returnContainer(child: Container(child: SteamBuilder));

你应该改成这样应该没问题:

body: Container(
            child: !isReady
                ? const Center(
                    child: Text(
                      "Waiting...",
                      style: TextStyle(fontSize: 24, color: Colors.red),
                    ),
                  )
      
                : StreamBuilder<List<int>>(

第一个 Container 只是根据布尔值包装内容,您不需要它。根据 flutter team:

Wrapping a widget in Container with no other parameters set has no effect and makes code needlessly more complex

所以你可以直接做:

body: !isReady ? buildSomething() : Container(....more code);