Everything expands to screenwidth inside a Listview. Can I change that?

前端 未结 5 2265
深忆病人
深忆病人 2021-02-13 11:59

I\'m trying to make a design of a chat screen for an app that I\'m making. To make it scrollable I placed all the chat messages inside a listview. But everything I place inside

5条回答
  •  野的像风
    2021-02-13 12:12

    I have done a little bit of refactor on your code an here is the result:

    Basically I keep a flag for the type of message (sent or received) and align the message card accordingly

    Note I did not have the time to review the code but I noticed a lot of unnecessary nesting so you may want to revise the layout a little bit

    class ChatScreen extends StatefulWidget {
      @override
      State createState() {
        return new ChatScreenState();
      }
    }
    
    class ChatMessage extends StatelessWidget {
      String type;
      ChatMessage({this.type});
      @override
      Widget build(BuildContext context) {
        return new Row(
          mainAxisAlignment:
              this.type == "sent" ? MainAxisAlignment.end : MainAxisAlignment.start,
          children: [
            new Card(
              color: Colors.green,
              child: new Padding(
                padding: new EdgeInsets.all(7.0),
                child: new Column(
                  crossAxisAlignment: CrossAxisAlignment.end,
                  children: [
                    new Text('Message'),
                    new Text('17:00'),
                  ],
                ),
              ),
            ),
          ],
        );
      }
    }
    
    class ChatScreenState extends State {
      bool overlayShouldBeVisible = false;
    
      @override
      Widget build(BuildContext context) {
        return new Stack(
          fit: StackFit.expand,
          children: [
            new Scaffold(
              appBar: new AppBar(
                title: new Text(
                  'Chatroom name',
                  style: new TextStyle(
                    color: Colors.black,
                  ),
                ),
                centerTitle: true,
                backgroundColor: Colors.white,
                elevation: 0.0,
              ),
              body: new Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  new Expanded(
                    child: new Container(
                      decoration: new BoxDecoration(
                          //image: new DecorationImage(image: new AssetImage('assets/backgroundChat.jpg',),fit: BoxFit.cover)
                          ),
                      child: new ListView(
                        children: [
                          new ChatMessage(
                            type: "sent",
                          ),
                          new ChatMessage(
                            type: "sent",
                          ),
                          new ChatMessage(
                            type: "received",
                          ),
                          new ChatMessage(
                            type: "sent",
                          ),
                          new ChatMessage(
                            type: "received",
                          ),
                          new ChatMessage(
                            type: "received",
                          ),
                        ],
                      ),
                    ),
                  ),
                  new Container(
                    height: 50.0,
                    color: Colors.white,
                    child: new Row(
                      crossAxisAlignment: CrossAxisAlignment.stretch,
                      children: [
                        new Expanded(
                          child: new Padding(
                            padding: new EdgeInsets.only(left: 20.0),
                            child: new TextField(),
                          ),
                        ),
                        new Material(
                          color: Colors.white,
                          child: new InkWell(
                            child: new Padding(
                              padding: new EdgeInsets.symmetric(horizontal: 20.0),
                              child: new Icon(
                                Icons.send,
                                color: Colors.blue,
                              ),
                            ),
                            onTap: () => print('send'),
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
            //overlayShouldBeVisible == true ? new JsonLoader(): new Container(),
            //Library.debugMode ? new DebugOverlay(): new Container(),
          ],
        );
      }
    }
    

    or as Rémi suggested you can just use Align instead of Row like so:

    return new Align(
          alignment:this.type!="sent"?  FractionalOffset.centerLeft:FractionalOffset.centerRight,
                      child: 
                        new Card(
        ..
    

提交回复
热议问题