问:
azure pipeline TFVC check if a specific Build pipeline artifacts exist for a specific Branch name and specific tag

I am using Azure DevOps services and TFVC as my code repository.
I have a build that has a task type "Download build artifacts" (Download files that were saved as artifacts of a completed build).
What i need to check is if there are saved artifacts of a specific completed build for a specific Branch name and tag? because if there isn't the task will fail and i want to fall to a default artifact.

Thanks

答:
Just define this task like this:

```<code>steps:
- task: DownloadBuildArtifacts@0
  displayName: 'Download Build Artifacts'
  inputs:
    buildType: specific
    project: '{project name}'
    pipeline: {pipeline name}
    buildVersionToDownload: latestFromBranch
    branchName: '{Branch name, e.g. $/TFVC}'
    tags: {the tag you want to filtered}
    downloadType: specific
    downloadPath: '$(Build.ArtifactStagingDirectory)'
</code>```

In this task definition, the most key parameters is the branchname because you are using a TFVC repos.

Body:
Just define this task like this:

steps:
- task: DownloadBuildArtifacts@0
  displayName: 'Download Build Artifacts'
  inputs:
    buildType: specific
    project: '{project name}'
    pipeline: {pipeline name}
    buildVersionToDownload: latestFromBranch
    branchName: '{Branch name, e.g. $/TFVC}'
    tags: {the tag you want to filtered}
    downloadType: specific
    downloadPath: '$(Build.ArtifactStagingDirectory)'

In this task definition, the most key parameters is the branchname because you are using a TFVC repos.


来源: stackexchange

问:
Angular Template reference throwing error
I got two arrays variables, which needs to render same html content.

```<code>notification = [...]
disruptionNotification = [...]
</code>```

Below is my HTML,

```<code>  <ng-container *ngFor="let notification of notifications; let i = index">
      <ng-container *ngTemplateOutlet="notification"></ng-container>
  </ng-container>
  <ng-container *ngFor="let notification of disruptionNotification; let i = index">
      <ng-container *ngTemplateOutlet="notification"></ng-container>
  </ng-container>

  <ng-template #notification>
      <tag-notification [type]="notification.type">
      <ng-container *ngIf="notification.titleLink && notification.title; else bwcNotificationTitleOnly">
       ....
      </ng-container>
    </tag-notification>
  </ng-template>
</code>```

But after rendering, I'm this error TypeError: templateRef.createEmbeddedView is not a function

StackBlitz Link : https://stackblitz.com/edit/angular-bxcmrp

Expected result should be,

```<code>This is Title
This is Title
This is disruptionNotifications
This is disruptionNotifications
</code>```

答: Whatever element you reference in the *ngIf else clause can’t be any arbitrary component, but it must be a ng-template.</p>

ContentLicense: CC BY-SA 4.0

Body:
I got two arrays variables, which needs to render same html content.

notification = [...]
disruptionNotification = [...]

Below is my HTML,

  <ng-container *ngFor="let notification of notifications; let i = index">
      <ng-container *ngTemplateOutlet="notification"></ng-container>
  </ng-container>
  <ng-container *ngFor="let notification of disruptionNotification; let i = index">
      <ng-container *ngTemplateOutlet="notification"></ng-container>
  </ng-container>

  <ng-template #notification>
      <tag-notification [type]="notification.type">
      <ng-container *ngIf="notification.titleLink && notification.title; else bwcNotificationTitleOnly">
       ....
      </ng-container>
    </tag-notification>
  </ng-template>

But after rendering, I'm this error TypeError: templateRef.createEmbeddedView is not a function

StackBlitz Link : https://stackblitz.com/edit/angular-bxcmrp

Expected result should be,

This is Title
This is Title
This is disruptionNotifications
This is disruptionNotifications


问:
How to Create a Table from JSON objects?
I am trying to make a table from json objects, actually i have  JSON objects in large quantity. But first i am trying to create tabe for few JSON objects, if this will go right , i willl implement this method later on.

This is what i tried so Far.

```<code>   var  attributes =

     [

      {

        "name": "Asset #",

        "display_name": "Asset #",

        "key": "header2",

        "values": {

          "MSSBL": "4-194169767930##1-2H77NZSQ",

          "SNOW": "4-194169767930##1-2H77NZSQ"},

        "type": "header",

        "data_type": "Text",

        "editable": "N"

      },

      {

        "name": "Serial Number",

        "display_name": "Serial Number",

        "key": "header3",

        "values": {

          "MSSBL": "21256112##1-2H77NZSQ",

          "SNOW": "NA##1-2H77NZSQ"},

        "type": "header",

        "data_type": "Text",

        "editable": "N"

      },

      {

        "name": "ACCOUNT NUMBER",

        "display_name": "ACCOUNT NUMBER",

        "key": "header6",

        "values": { "MSSBL": "532649##1-2H77NZSQ",
          "SNOW": "NA##1-2H77NZSQ"},

        "type": "header",

        "data_type": "Text",

        "editable": "N"

      }
    ]
           var key = [];

           document.write("<table border==\"1\"><tr>");
           for (key in attributes[0]) {
           document.write('<td>' + '<b>' + key + '</b>' + '</td>');
            }

            document.write("</tr>");
            for (var i = 0; i < attributes.length; i++) {
            document.write('<tr>');
            for (key in attributes[i]) {
             document.write('<td>' + attributes[i][key] + '</td>');
             }
            document.write('</tr>');
              }
            document.write("</table>");
</code>```

Actually i am facing a issue when, i am trying  to add Values inside the table if I remove values then the table is visible in output otherwise no output
'

```<code>           "values": {
        "MSSBL": "4-194169767930##1-2H77NZSQ",
          "SNOW": "4-194169767930##1-2H77NZSQ"},
</code>```

答:
Have a look at this: https://github.com/MubashirEbad/Library-Management-System/blob/fd73fc6f1fa483c376f395f6df6a2b1129a7897f/index.html#L11
It currently only maps the table data rows. You need to run another loop for the headers in table.</p>

Body:
I am trying to make a table from json objects, actually i have  JSON objects in large quantity. But first i am trying to create tabe for few JSON objects, if this will go right , i willl implement this method later on.

This is what i tried so Far.

   var  attributes =

     [

      {

        "name": "Asset #",

        "display_name": "Asset #",

        "key": "header2",

        "values": {

          "MSSBL": "4-194169767930##1-2H77NZSQ",

          "SNOW": "4-194169767930##1-2H77NZSQ"},

        "type": "header",

        "data_type": "Text",

        "editable": "N"

      },

      {

        "name": "Serial Number",

        "display_name": "Serial Number",

        "key": "header3",

        "values": {

          "MSSBL": "21256112##1-2H77NZSQ",

          "SNOW": "NA##1-2H77NZSQ"},

        "type": "header",

        "data_type": "Text",

        "editable": "N"

      },

      {

        "name": "ACCOUNT NUMBER",

        "display_name": "ACCOUNT NUMBER",

        "key": "header6",

        "values": { "MSSBL": "532649##1-2H77NZSQ",
          "SNOW": "NA##1-2H77NZSQ"},

        "type": "header",

        "data_type": "Text",

        "editable": "N"

      }
    ]
           var key = [];

           document.write("

");
           for (key in attributes[0]) {
           document.write('' + '' + key + '' + '	');
            }

            document.write("
");
            for (var i = 0; i < attributes.length; i++) {
            document.write('
');
            for (key in attributes[i]) {
             document.write('' + attributes[i][key] + '	');
             }
            document.write('
');
              }
            document.write("
");

Actually i am facing a issue when, i am trying  to add Values inside the table if I remove values then the table is visible in output otherwise no output
'

           "values": {
        "MSSBL": "4-194169767930##1-2H77NZSQ",
          "SNOW": "4-194169767930##1-2H77NZSQ"},


问:
Datetime-like index in `pandas`
I have a DataFrame loaded with a time series of cumulative rainfall:

```<code>df = pd.read_csv(csv_file, parse_dates=[['date', 'time']], dayfirst=True, index_col=0)
</code>```

(I can't share the source data, it is read through an adapter object that presents the data as a text file with .csv content to read_csv, event though the source file is in some proprietary format - however, it's not related to the problem, the end result is DataFrame with a datetime index and floating point values - date could be dummied)

The rainfall is then converted resampled into minutes:

```<code>rainfall_differences = df['rainfall'].diff()
rainfall_differences = rainfall_differences.resample('1min', label='right', closed='right').sum()
</code>```

All this works as expected. However, my question is about the difference between these two statements:

```<code>x = rainfall_differences.rolling('90min').sum()
y = rainfall_differences.rolling('1.5h').sum()
</code>```

The first works, but the second throws an exception:

```<code>  File "<<path>>/my_file.py", line 68, in load_rainfalls
    result[duration_label] = rainfall_differences.rolling(duration_label).sum()
  File "<<path>>\lib\site-packages\pandas\core\generic.py", line 10386, in rolling
    closed=closed,
  File "<<path>>\lib\site-packages\pandas\core\window\rolling.py", line 94, in __init__
    self.validate()
  File "<<path>>\lib\site-packages\pandas\core\window\rolling.py", line 1836, in validate
    freq = self._validate_freq()
  File "<<path>>\lib\site-packages\pandas\core\window\rolling.py", line 1888, in _validate_freq
    f"passed window {self.window} is not "
ValueError: passed window 1.5h is not compatible with a datetimelike index
</code>```

My question: why would a window of '90min' be compatible with a datetimelike index, when a window of '1.5h' is not, even though both evaluate into the identical value Timedelta('0 days 01:30:00') when passed to pandas.to_timedelta()?

Note: I'm aware of how to solve/work around the issue, but that's not my question. I'm wondering why this is even required. For example:

```<code>index_duration = str(int(pd.to_timedelta('1.5 hour').total_seconds() / 60)) + 'min'
y = rainfall_differences.rolling(index_duration).sum()
</code>```

答:
I think is necessary change h to H:

```<code>y = rainfall_differences.rolling('1.5H').sum()
</code>```

I think reason is because not valid offset alias:

```<code>Alias   Description
H       hourly frequency
T, min  minutely frequency
S       secondly frequency
</code>```

Sample:

```<code>rng = pd.date_range('2017-04-03', periods=5, freq='10T')
rainfall_differences = pd.DataFrame({'a': range(5)}, index=rng)
print (rainfall_differences)
                     a
2017-04-03 00:00:00  0
2017-04-03 00:10:00  1
2017-04-03 00:20:00  2
2017-04-03 00:30:00  3
2017-04-03 00:40:00  4

y = rainfall_differences.rolling('1.5H').sum()
print (y)
                        a
2017-04-03 00:00:00   0.0
2017-04-03 00:10:00   1.0
2017-04-03 00:20:00   3.0
2017-04-03 00:30:00   6.0
2017-04-03 00:40:00  10.0
</code>```

Title: Datetime-like index in `pandas`

Body:
I have a DataFrame loaded with a time series of cumulative rainfall:

df = pd.read_csv(csv_file, parse_dates=[['date', 'time']], dayfirst=True, index_col=0)

(I can't share the source data, it is read through an adapter object that presents the data as a text file with .csv content to read_csv, event though the source file is in some proprietary format - however, it's not related to the problem, the end result is DataFrame with a datetime index and floating point values - date could be dummied)

The rainfall is then converted resampled into minutes:

rainfall_differences = df['rainfall'].diff()
rainfall_differences = rainfall_differences.resample('1min', label='right', closed='right').sum()

All this works as expected. However, my question is about the difference between these two statements:

x = rainfall_differences.rolling('90min').sum()
y = rainfall_differences.rolling('1.5h').sum()

The first works, but the second throws an exception:

  File "<<path>>/my_file.py", line 68, in load_rainfalls
    result[duration_label] = rainfall_differences.rolling(duration_label).sum()
  File "<<path>>\lib\site-packages\pandas\core\generic.py", line 10386, in rolling
    closed=closed,
  File "<<path>>\lib\site-packages\pandas\core\window\rolling.py", line 94, in __init__
    self.validate()
  File "<<path>>\lib\site-packages\pandas\core\window\rolling.py", line 1836, in validate
    freq = self._validate_freq()
  File "<<path>>\lib\site-packages\pandas\core\window\rolling.py", line 1888, in _validate_freq
    f"passed window {self.window} is not "
ValueError: passed window 1.5h is not compatible with a datetimelike index

My question: why would a window of '90min' be compatible with a datetimelike index, when a window of '1.5h' is not, even though both evaluate into the identical value Timedelta('0 days 01:30:00') when passed to pandas.to_timedelta()?

Note: I'm aware of how to solve/work around the issue, but that's not my question. I'm wondering why this is even required. For example:

index_duration = str(int(pd.to_timedelta('1.5 hour').total_seconds() / 60)) + 'min'
y = rainfall_differences.rolling(index_duration).sum()

Body:
I think is necessary change h to H:

y = rainfall_differences.rolling('1.5H').sum()

I think reason is because not valid offset alias:

Alias   Description
H       hourly frequency
T, min  minutely frequency
S       secondly frequency

Sample:

rng = pd.date_range('2017-04-03', periods=5, freq='10T')
rainfall_differences = pd.DataFrame({'a': range(5)}, index=rng)
print (rainfall_differences)
                     a
2017-04-03 00:00:00  0
2017-04-03 00:10:00  1
2017-04-03 00:20:00  2
2017-04-03 00:30:00  3
2017-04-03 00:40:00  4

y = rainfall_differences.rolling('1.5H').sum()
print (y)
                        a
2017-04-03 00:00:00   0.0
2017-04-03 00:10:00   1.0
2017-04-03 00:20:00   3.0
2017-04-03 00:30:00   6.0
2017-04-03 00:40:00  10.0


问:
Upload two files and an object are failing with error 415
I am trying to consume an http rest call that takes input of two files a dto

```<code>@RequestMapping(name = "/my/endpoint", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE,
            MediaType.APPLICATION_JSON_VALUE})
    public @ResponseBody
    EndpointDto createEndpoint(@RequestBody MultipartFile requestFile, @RequestBody MultipartFile responseFile,
                               @RequestBody MyDto myDto){
        return endpointService.createEndpoint(requestFile, responseFile, myDto);
    }
</code>```

I received the following error:

```<code>    org.springframework.web.HttpMediaTypeNotSupportedException:
Content type 'multipart/form-data;boundary=----WebKitFormBoundarylq2UHYfBi0nAsRo7;charset=UTF-8' not supported
</code>```

I consume the endpoint through swagger.
I think that the problem lies in the way I handle the input fields but I don't know what is the problem.

答:
You can change the controller parameter as below

```<code>@RequestMapping(name = "/my/endpoint", method = RequestMethod.POST)
public ResponseEntity<EndpointDTO> createEndpoint(
   @RequestPart(value = "file1") MultipartFile filea,
   @RequestPart(value = "file2") MultipartFile fileb,
   @RequestPart MyDto myDto){
    return endpointService.createEndpoint(filea, fileb, myDto);
}
</code>```

You can get the files and DTO values using @RequestPart.

You can test above API using following curl

```<code>curl -v -H "Content-Type:multipart/form-data" -F "myDto=@body;type=application/json" -F "file1=@file1.txt" -F "file2=@file2.txt" -X POST http://<path>/my/endpoint
</code>```

Note: Here I'm using 'body' file to pass the payload and file1.txt & file2.txt to pass the MultipartFile. Hope you are familiar with the curl command and understand it.

Body:
I am trying to consume an http rest call that takes input of two files a dto

@RequestMapping(name = "/my/endpoint", method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE,
            MediaType.APPLICATION_JSON_VALUE})
    public @ResponseBody
    EndpointDto createEndpoint(@RequestBody MultipartFile requestFile, @RequestBody MultipartFile responseFile,
                               @RequestBody MyDto myDto){
        return endpointService.createEndpoint(requestFile, responseFile, myDto);
    }

I received the following error:

    org.springframework.web.HttpMediaTypeNotSupportedException:
Content type 'multipart/form-data;boundary=----WebKitFormBoundarylq2UHYfBi0nAsRo7;charset=UTF-8' not supported

I consume the endpoint through swagger.
I think that the problem lies in the way I handle the input fields but I don't know what is the problem.

Body:
You can change the controller parameter as below

@RequestMapping(name = "/my/endpoint", method = RequestMethod.POST)
public ResponseEntity<EndpointDTO> createEndpoint(
   @RequestPart(value = "file1") MultipartFile filea,
   @RequestPart(value = "file2") MultipartFile fileb,
   @RequestPart MyDto myDto){
    return endpointService.createEndpoint(filea, fileb, myDto);
}

You can get the files and DTO values using @RequestPart.

You can test above API using following curl

curl -v -H "Content-Type:multipart/form-data" -F "myDto=@body;type=application/json" -F "file1=@file1.txt" -F "file2=@file2.txt" -X POST http://<path>/my/endpoint

Note: Here I'm using 'body' file to pass the payload and file1.txt & file2.txt to pass the MultipartFile. Hope you are familiar with the curl command and understand it.


问:
jQuery dropdown - CSS issues
Hey, if you to go: http://catonthecouchproductions.com/fish/ and those images under the dropdown are suppose to be hidden then appear on hover, I have this so far:

```<code>$(document).ready(function() {
    $('.btn-fishing-trip').hover(function() {
        $('.fishing-trip').slideDown("slow");
    }, function() {
        $('.fishing-trip').slideUp("slow");
    });
    $('.btn-combo').hover(function() {
        $('.combo').slideDown("slow");
    }, function() {
        $('.combo').slideUp("slow");
    });
});
</code>```

But it is behaving weird. Any suggestions on what I can do? I think since once goes up the other slides over taking its place. Should i use animate() not slideDown?

答: You can still use the slideDown, slideUp, which is really useful. I think your problem is with the .hover, try with .mouseover and then mouseout as the callback. Because now it seems the event to stop the slider isn't called properly since it loops again and again. Also, I don't get the hang of what's suppose to happen exaclty, I think you've mixed up some elements or something. You can try to add a class as well on items who're supposed to be hidden or showed and then use the .hasClass(); when you want to check if they have a certain class or not, that way you can determine if you should slide it up or down.</p>

LastEditorDisplayName: Soviut

ContentLicense: CC BY-SA 2.5

Title: jQuery dropdown - CSS issues

Body:
Hey, if you to go: http://catonthecouchproductions.com/fish/ and those images under the dropdown are suppose to be hidden then appear on hover, I have this so far:

$(document).ready(function() {
    $('.btn-fishing-trip').hover(function() {
        $('.fishing-trip').slideDown("slow");
    }, function() {
        $('.fishing-trip').slideUp("slow");
    });
    $('.btn-combo').hover(function() {
        $('.combo').slideDown("slow");
    }, function() {
        $('.combo').slideUp("slow");
    });
});

But it is behaving weird. Any suggestions on what I can do? I think since once goes up the other slides over taking its place. Should i use animate() not slideDown?

OwnerDisplayName: konno


问:
movie clips on iOS
Hi all
Im looking to play a movie on an iOS device and found MPMoviePlayerController which works very easily. So i have my movie playing but i dont want any of the video controls to be visible/active. i was looking through the settings and found things like

```<code>[moviePlayerController setMovieControlMode:MPMovieControlModeHidden];

[moviePlayerController setMovieControlMode:MPMovieControlStyleNone];
</code>```

and while they do remove the on screen control while the movie is playing they are still visible on initial start of movie.
basically just want to play my movie at start of app without any extra overlays of controls at all ever.
any ideas how to do this?
any help would be appreciated

g

答:
moviePlayerController.controlStyle = MPMovieControlStyleNone;

movieControlMode has been deprecated.

Remember, This way the user won't have access to the controls.

ContentLicense: CC BY-SA 3.0

Title: movie clips on iOS

Body:
Hi all
Im looking to play a movie on an iOS device and found MPMoviePlayerController which works very easily. So i have my movie playing but i dont want any of the video controls to be visible/active. i was looking through the settings and found things like

[moviePlayerController setMovieControlMode:MPMovieControlModeHidden];

[moviePlayerController setMovieControlMode:MPMovieControlStyleNone];

and while they do remove the on screen control while the movie is playing they are still visible on initial start of movie.
basically just want to play my movie at start of app without any extra overlays of controls at all ever.
any ideas how to do this?
any help would be appreciated

g


问:
Connect to Ignite Cluster over SSL using JDBC Thin Client
Though, I've setup SSL between all Ignite Nodes and whole Ignite Cluster is secured, I'm able to access the data through JDBC thin client without passing any SSL configs. Does it mean though the cluster is secured we can connect without passing any ssl config/cert?

I want no one can connect to the Ignite Cluster until and unless required ssl certs provided, is that possible to achieve?

答:
You need explicitly enable SSL for thin protocols:

https://www.gridgain.com/docs/latest/developers-guide/thin-clients/getting-started-with-thin-clients#enabling-ssltls-for-thin-clients

```<code><property name="clientConnectorConfiguration">
    <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
        <property name="sslEnabled" value="true"/>
    </bean>
</property>
</code>```

Body:
You need explicitly enable SSL for thin protocols:

https://www.gridgain.com/docs/latest/developers-guide/thin-clients/getting-started-with-thin-clients#enabling-ssltls-for-thin-clients

<property name="clientConnectorConfiguration">
    <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
        <property name="sslEnabled" value="true"/>
    </bean>
</property>


问:
How to make a webview scrollable in tabbarwiew in Flutter
I've spent almost two days trying to figure out how to make a webview scrollable in a tabbarview in Flutter. I understand that the TabBarWiew Widget should be wrapped in a fixed height widget, what can be a workaround for this?
I don't know if it can help but my minSdkVersion is 16 and targetSdkVersion is 28,
And this is the output of flutter --version command

```<code>Flutter 1.12.13+hotfix.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 27321ebbad (10 weeks ago) • 2019-12-10 18:15:01 -0800
Engine • revision 2994f7e1e6
Tools • Dart 2.7.0
</code>```

Below is the code for the page I'm building.

```<code>import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Pays'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

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

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.

    double screenHeight = MediaQuery.of(context).size.height;

    final List<Tab> myTabs = <Tab>[
      Tab(text: 'LEFT'),
      Tab(text: 'RIGHT'),
    ];

    TabController _tabController;

    @override
    void initState() {
      super.initState();
      _tabController = TabController(vsync: this, length: myTabs.length);
    }

    @override
    void dispose() {
      _tabController.dispose();
      super.dispose();
    }

    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
        backgroundColor: Colors.red[800],
      ),
      body: Container(
          color: Colors.grey[100],
          child: ListView(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Expanded(
                      child: Image.network(
                    'https://lh3.googleusercontent.com/proxy/dThF-49TD0synkY_v1F0mh2HQFp_P5bxYvdLI1msK-aD7h4CtzctJpJP3Cm89LyAWAg21xqvUDdQjdRi2yDH4iEU1wr_LT3BO8iOmx141QOtzXPgUpXW7ulAlHUtAJ4Z0yea_Qr4sWZfApns3VuAbxNcTNISWdStSoJEZ9-OmRypu-3YTQ',
                    height: 150,
                    fit: BoxFit.fitWidth,
                    alignment: Alignment.topCenter,
                    filterQuality: FilterQuality.high,
                  )),
                ],
              ),
              SizedBox(
                height: 1,
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: <Widget>[
                    Text('237',
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 35,
                            fontWeight: FontWeight.bold)),
                    SizedBox(
                      width: 5,
                    ),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJrM_W9cpz33KFyqL_L-meeCuH_Kyufoohxjlh06XdBnIbel0j&s',
                      height: 30,
                    ),
                    Spacer(),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTwnqIeW1RJHtAhRE7ccZ-4s4ymEh5zHRYAdidO7p9GfDnOwziY&s',
                      height: 50,
                    )
                  ],
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Cameroun',
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 25,
                            fontWeight: FontWeight.bold),
                      )
                    ]),
              ),
              SizedBox(height: 5),
              NestedTabBar()
            ],
          )),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class NestedTabBar extends StatefulWidget {
  @override
  _NestedTabBarState createState() => _NestedTabBarState();
}

class _NestedTabBarState extends State<NestedTabBar>
    with TickerProviderStateMixin {
  TabController _nestedTabController;
  ScrollController _scrollController;

  @override
  void initState() {
    //_scrollController = ScrollController();
    super.initState();
    _nestedTabController = new TabController(length: 2, vsync: this);
    //_nestedTabController.addListener(_handleTabSelection);
  }

  @override
  void dispose() {
    _nestedTabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    return Column(
      children: <Widget>[
        TabBar(
          controller: _nestedTabController,
          indicatorColor: Colors.teal,
          labelColor: Colors.teal,
          unselectedLabelColor: Colors.black54,
          isScrollable: true,
          tabs: <Widget>[
            Tab(
              text: "A propos & Statistiques",
            ),
            Tab(
              text: "Wiki",
            )
          ],
        ),
        Container(
          height: screenHeight * 0.9,
          margin: EdgeInsets.only(left: 8.0, right: 8.0),
          child: TabBarView(
            controller: _nestedTabController,
            children: <Widget>[
              Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8.0),
                  ),
                  child: Text('Simple text')),

              /*GestureDetector(
                    child: MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton'),
              ),*/

              Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: MyWebView(
                    selectedUrl: 'https://fr.wikipedia.org/wiki/Cameroun'),
              ),
            ],
          ),
        ),
        // MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton')
      ],
    );
  }
}

class MyWebView extends StatefulWidget {
  final String selectedUrl;

  MyWebView({
    @required this.selectedUrl,
  });

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

class _MyWebViewState extends State<MyWebView> {
  Completer<WebViewController> _controller;

  @override
  void initState() {
    super.initState();
    _controller = Completer<WebViewController>();
  }

  @override
  void dispose() {
    super.dispose();
    _controller = null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: WebView(
      initialUrl: widget.selectedUrl,
      gestureRecognizers: Set()
        ..add(Factory<VerticalDragGestureRecognizer>(
            () => VerticalDragGestureRecognizer())),
      gestureNavigationEnabled: true,
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController webViewController) {
        _controller.complete(webViewController);
      },
    ));
  }
}
</code>```

答:
You can copy paste run full code below

You can use package https://pub.dev/packages/flutter_inappwebview

Step 1: change Android minSdkVersion to 17

Step 2: reference package with the following , because this issue. https://github.com/pichillilorenzo/flutter_inappwebview/issues/220

```<code>flutter_inappwebview:
    git:
      url: https://github.com/pichillilorenzo/flutter_inappwebview.git
      ref: master
</code>```

Step 3: code snippet

```<code>Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: InAppWebView(
                  initialUrl: "https://fr.wikipedia.org/wiki/Lewis_Hamilton",
                  initialHeaders: {},
</code>```

working demo

full code

```<code>import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Pays'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;

    final List<Tab> myTabs = <Tab>[
      Tab(text: 'LEFT'),
      Tab(text: 'RIGHT'),
    ];

    TabController _tabController;

    @override
    void initState() {
      super.initState();
      _tabController = TabController(vsync: this, length: myTabs.length);
    }

    @override
    void dispose() {
      _tabController.dispose();
      super.dispose();
    }

    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
        backgroundColor: Colors.red[800],
      ),
      body: Container(
          color: Colors.grey[100],
          child: ListView(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Expanded(
                      child: Image.network(
                    'https://lh3.googleusercontent.com/proxy/dThF-49TD0synkY_v1F0mh2HQFp_P5bxYvdLI1msK-aD7h4CtzctJpJP3Cm89LyAWAg21xqvUDdQjdRi2yDH4iEU1wr_LT3BO8iOmx141QOtzXPgUpXW7ulAlHUtAJ4Z0yea_Qr4sWZfApns3VuAbxNcTNISWdStSoJEZ9-OmRypu-3YTQ',
                    height: 150,
                    fit: BoxFit.fitWidth,
                    alignment: Alignment.topCenter,
                    filterQuality: FilterQuality.high,
                  )),
                ],
              ),
              SizedBox(
                height: 1,
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: <Widget>[
                    Text('237',
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 35,
                            fontWeight: FontWeight.bold)),
                    SizedBox(
                      width: 5,
                    ),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJrM_W9cpz33KFyqL_L-meeCuH_Kyufoohxjlh06XdBnIbel0j&s',
                      height: 30,
                    ),
                    Spacer(),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTwnqIeW1RJHtAhRE7ccZ-4s4ymEh5zHRYAdidO7p9GfDnOwziY&s',
                      height: 50,
                    )
                  ],
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Cameroun',
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 25,
                            fontWeight: FontWeight.bold),
                      )
                    ]),
              ),
              SizedBox(height: 5),
              NestedTabBar()
            ],
          )),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class NestedTabBar extends StatefulWidget {
  @override
  _NestedTabBarState createState() => _NestedTabBarState();
}

class _NestedTabBarState extends State<NestedTabBar>
    with TickerProviderStateMixin {
  TabController _nestedTabController;
  ScrollController _scrollController;

  InAppWebViewController webView;
  String url = "";
  double progress = 0;

  @override
  void initState() {
    //_scrollController = ScrollController();
    super.initState();
    _nestedTabController = new TabController(length: 2, vsync: this);
    //_nestedTabController.addListener(_handleTabSelection);
  }

  @override
  void dispose() {
    _nestedTabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    return Column(
      children: <Widget>[
        TabBar(
          controller: _nestedTabController,
          indicatorColor: Colors.teal,
          labelColor: Colors.teal,
          unselectedLabelColor: Colors.black54,
          isScrollable: true,
          tabs: <Widget>[
            Tab(
              text: "A propos & Statistiques",
            ),
            Tab(
              text: "Wiki",
            )
          ],
        ),
        Container(
          height: screenHeight * 0.9,
          margin: EdgeInsets.only(left: 8.0, right: 8.0),
          child: TabBarView(
            controller: _nestedTabController,
            children: <Widget>[
              Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8.0),
                  ),
                  child: Text('Simple text')),

              /*GestureDetector(
                    child: MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton'),
              ),*/

              Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: InAppWebView(
                  initialUrl: "https://fr.wikipedia.org/wiki/Lewis_Hamilton",
                  initialHeaders: {},
                  initialOptions: InAppWebViewWidgetOptions(
                      crossPlatform: InAppWebViewOptions(
                        debuggingEnabled: true,
                      )
                  ),
                  onWebViewCreated: (InAppWebViewController controller) {
                    webView = controller;
                  },
                  onLoadStart: (InAppWebViewController controller, String url) {
                    setState(() {
                      this.url = url;
                    });
                  },
                  onLoadStop: (InAppWebViewController controller, String url) async {
                    setState(() {
                      this.url = url;
                    });
                  },
                  onProgressChanged: (InAppWebViewController controller, int progress) {
                    setState(() {
                      this.progress = progress / 100;
                    });
                  },
                ),
              ),
            ],
          ),
        ),
        // MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton')
      ],
    );
  }
}
</code>```

Body:
I've spent almost two days trying to figure out how to make a webview scrollable in a tabbarview in Flutter. I understand that the TabBarWiew Widget should be wrapped in a fixed height widget, what can be a workaround for this?
I don't know if it can help but my minSdkVersion is 16 and targetSdkVersion is 28,
And this is the output of flutter --version command

Flutter 1.12.13+hotfix.5 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 27321ebbad (10 weeks ago) • 2019-12-10 18:15:01 -0800
Engine • revision 2994f7e1e6
Tools • Dart 2.7.0

Below is the code for the page I'm building.

import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Pays'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

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

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.

    double screenHeight = MediaQuery.of(context).size.height;

    final List<Tab> myTabs = <Tab>[
      Tab(text: 'LEFT'),
      Tab(text: 'RIGHT'),
    ];

    TabController _tabController;

    @override
    void initState() {
      super.initState();
      _tabController = TabController(vsync: this, length: myTabs.length);
    }

    @override
    void dispose() {
      _tabController.dispose();
      super.dispose();
    }

    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
        backgroundColor: Colors.red[800],
      ),
      body: Container(
          color: Colors.grey[100],
          child: ListView(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Expanded(
                      child: Image.network(
                    'https://lh3.googleusercontent.com/proxy/dThF-49TD0synkY_v1F0mh2HQFp_P5bxYvdLI1msK-aD7h4CtzctJpJP3Cm89LyAWAg21xqvUDdQjdRi2yDH4iEU1wr_LT3BO8iOmx141QOtzXPgUpXW7ulAlHUtAJ4Z0yea_Qr4sWZfApns3VuAbxNcTNISWdStSoJEZ9-OmRypu-3YTQ',
                    height: 150,
                    fit: BoxFit.fitWidth,
                    alignment: Alignment.topCenter,
                    filterQuality: FilterQuality.high,
                  )),
                ],
              ),
              SizedBox(
                height: 1,
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: <Widget>[
                    Text('237',
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 35,
                            fontWeight: FontWeight.bold)),
                    SizedBox(
                      width: 5,
                    ),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJrM_W9cpz33KFyqL_L-meeCuH_Kyufoohxjlh06XdBnIbel0j&s',
                      height: 30,
                    ),
                    Spacer(),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTwnqIeW1RJHtAhRE7ccZ-4s4ymEh5zHRYAdidO7p9GfDnOwziY&s',
                      height: 50,
                    )
                  ],
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Cameroun',
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 25,
                            fontWeight: FontWeight.bold),
                      )
                    ]),
              ),
              SizedBox(height: 5),
              NestedTabBar()
            ],
          )),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class NestedTabBar extends StatefulWidget {
  @override
  _NestedTabBarState createState() => _NestedTabBarState();
}

class _NestedTabBarState extends State<NestedTabBar>
    with TickerProviderStateMixin {
  TabController _nestedTabController;
  ScrollController _scrollController;

  @override
  void initState() {
    //_scrollController = ScrollController();
    super.initState();
    _nestedTabController = new TabController(length: 2, vsync: this);
    //_nestedTabController.addListener(_handleTabSelection);
  }

  @override
  void dispose() {
    _nestedTabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    return Column(
      children: <Widget>[
        TabBar(
          controller: _nestedTabController,
          indicatorColor: Colors.teal,
          labelColor: Colors.teal,
          unselectedLabelColor: Colors.black54,
          isScrollable: true,
          tabs: <Widget>[
            Tab(
              text: "A propos & Statistiques",
            ),
            Tab(
              text: "Wiki",
            )
          ],
        ),
        Container(
          height: screenHeight * 0.9,
          margin: EdgeInsets.only(left: 8.0, right: 8.0),
          child: TabBarView(
            controller: _nestedTabController,
            children: <Widget>[
              Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8.0),
                  ),
                  child: Text('Simple text')),

              /*GestureDetector(
                    child: MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton'),
              ),*/

              Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: MyWebView(
                    selectedUrl: 'https://fr.wikipedia.org/wiki/Cameroun'),
              ),
            ],
          ),
        ),
        // MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton')
      ],
    );
  }
}

class MyWebView extends StatefulWidget {
  final String selectedUrl;

  MyWebView({
    @required this.selectedUrl,
  });

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

class _MyWebViewState extends State<MyWebView> {
  Completer<WebViewController> _controller;

  @override
  void initState() {
    super.initState();
    _controller = Completer<WebViewController>();
  }

  @override
  void dispose() {
    super.dispose();
    _controller = null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: WebView(
      initialUrl: widget.selectedUrl,
      gestureRecognizers: Set()
        ..add(Factory<VerticalDragGestureRecognizer>(
            () => VerticalDragGestureRecognizer())),
      gestureNavigationEnabled: true,
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController webViewController) {
        _controller.complete(webViewController);
      },
    ));
  }
}

Body:
You can copy paste run full code below

You can use package https://pub.dev/packages/flutter_inappwebview

Step 1: change Android minSdkVersion to 17

Step 2: reference package with the following , because this issue. https://github.com/pichillilorenzo/flutter_inappwebview/issues/220

flutter_inappwebview:
    git:
      url: https://github.com/pichillilorenzo/flutter_inappwebview.git
      ref: master

Step 3: code snippet

Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: InAppWebView(
                  initialUrl: "https://fr.wikipedia.org/wiki/Lewis_Hamilton",
                  initialHeaders: {},

working demo

full code

import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Pays'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;

    final List<Tab> myTabs = <Tab>[
      Tab(text: 'LEFT'),
      Tab(text: 'RIGHT'),
    ];

    TabController _tabController;

    @override
    void initState() {
      super.initState();
      _tabController = TabController(vsync: this, length: myTabs.length);
    }

    @override
    void dispose() {
      _tabController.dispose();
      super.dispose();
    }

    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
        backgroundColor: Colors.red[800],
      ),
      body: Container(
          color: Colors.grey[100],
          child: ListView(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Expanded(
                      child: Image.network(
                    'https://lh3.googleusercontent.com/proxy/dThF-49TD0synkY_v1F0mh2HQFp_P5bxYvdLI1msK-aD7h4CtzctJpJP3Cm89LyAWAg21xqvUDdQjdRi2yDH4iEU1wr_LT3BO8iOmx141QOtzXPgUpXW7ulAlHUtAJ4Z0yea_Qr4sWZfApns3VuAbxNcTNISWdStSoJEZ9-OmRypu-3YTQ',
                    height: 150,
                    fit: BoxFit.fitWidth,
                    alignment: Alignment.topCenter,
                    filterQuality: FilterQuality.high,
                  )),
                ],
              ),
              SizedBox(
                height: 1,
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: <Widget>[
                    Text('237',
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 35,
                            fontWeight: FontWeight.bold)),
                    SizedBox(
                      width: 5,
                    ),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJrM_W9cpz33KFyqL_L-meeCuH_Kyufoohxjlh06XdBnIbel0j&s',
                      height: 30,
                    ),
                    Spacer(),
                    Image.network(
                      'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTwnqIeW1RJHtAhRE7ccZ-4s4ymEh5zHRYAdidO7p9GfDnOwziY&s',
                      height: 50,
                    )
                  ],
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      Text(
                        'Cameroun',
                        textAlign: TextAlign.center,
                        style: TextStyle(
                            color: Colors.black,
                            fontSize: 25,
                            fontWeight: FontWeight.bold),
                      )
                    ]),
              ),
              SizedBox(height: 5),
              NestedTabBar()
            ],
          )),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class NestedTabBar extends StatefulWidget {
  @override
  _NestedTabBarState createState() => _NestedTabBarState();
}

class _NestedTabBarState extends State<NestedTabBar>
    with TickerProviderStateMixin {
  TabController _nestedTabController;
  ScrollController _scrollController;

  InAppWebViewController webView;
  String url = "";
  double progress = 0;

  @override
  void initState() {
    //_scrollController = ScrollController();
    super.initState();
    _nestedTabController = new TabController(length: 2, vsync: this);
    //_nestedTabController.addListener(_handleTabSelection);
  }

  @override
  void dispose() {
    _nestedTabController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    double screenHeight = MediaQuery.of(context).size.height;
    return Column(
      children: <Widget>[
        TabBar(
          controller: _nestedTabController,
          indicatorColor: Colors.teal,
          labelColor: Colors.teal,
          unselectedLabelColor: Colors.black54,
          isScrollable: true,
          tabs: <Widget>[
            Tab(
              text: "A propos & Statistiques",
            ),
            Tab(
              text: "Wiki",
            )
          ],
        ),
        Container(
          height: screenHeight * 0.9,
          margin: EdgeInsets.only(left: 8.0, right: 8.0),
          child: TabBarView(
            controller: _nestedTabController,
            children: <Widget>[
              Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(8.0),
                  ),
                  child: Text('Simple text')),

              /*GestureDetector(
                    child: MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton'),
              ),*/

              Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(8.0),
                ),
                child: InAppWebView(
                  initialUrl: "https://fr.wikipedia.org/wiki/Lewis_Hamilton",
                  initialHeaders: {},
                  initialOptions: InAppWebViewWidgetOptions(
                      crossPlatform: InAppWebViewOptions(
                        debuggingEnabled: true,
                      )
                  ),
                  onWebViewCreated: (InAppWebViewController controller) {
                    webView = controller;
                  },
                  onLoadStart: (InAppWebViewController controller, String url) {
                    setState(() {
                      this.url = url;
                    });
                  },
                  onLoadStop: (InAppWebViewController controller, String url) async {
                    setState(() {
                      this.url = url;
                    });
                  },
                  onProgressChanged: (InAppWebViewController controller, int progress) {
                    setState(() {
                      this.progress = progress / 100;
                    });
                  },
                ),
              ),
            ],
          ),
        ),
        // MyWebView(selectedUrl: 'https://fr.wikipedia.org/wiki/Lewis_Hamilton')
      ],
    );
  }
}


问:
Get unique Hardware id from PC
I tried getting Hard disk and Motherboard Serial Number from my PC. It works good in Windows 7 and Above

But same code in CMD does not working for Windows XP. It Shows O.E.M to be filled or Returns Nothing

```<code>wmic diskdrive get name,serialnumber,model // This is cmd to get serial num
</code>```

In Windows XP It Returns Error for serialnumber

```<code>wmic baseboard get product,Manufacturer,version,serialnumber // This is cmd to get MotherBoard serialnumber
</code>```

In Windows XP and Win 8  it returns in serialnumber Error like "To be filled by O.E.M"

Am looking for Best Pc Unique Id , which can return id or serialnumber for any OS and should be unique..

Please help me

Thank You.

答:
Remember Mac address and Volume serial can be change. Hence hardware will have unpredictable changes.

So use Processor and Motherboard ID so that hardware ID never changes.

So on these basis, you could modify @Mederic code as below:

```<code>'Get the MotherBoard ID
    Function GetMotherBoardID() As String
        Dim query As New SelectQuery("Win32_BaseBoard")
        Dim search As New ManagementObjectSearcher(query)
        For Each info As ManagementObject In search.Get()
            Return info("SerialNumber").ToString()
        Next
    End Function

'Get the Processor ID
    Function GetProcessorId() As String
        Dim query As New SelectQuery("Win32_processor")
        Dim search As New ManagementObjectSearcher(query)
        Dim info As ManagementObject
        For Each info In search.Get()
            Return info("processorId").ToString()
        Next
    End Function

' Generate Hash
    Function GenerateHash(ByVal input As String) As String
        Dim hash = New SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))
        Return String.Concat(hash.[Select](Function(b) b.ToString("x2")))
    End Function

'Now display Hardware ID
MessageBox.Show(GenerateHash(GetMotherBoardID() & GetProcessorId()))
</code>```

Source code : Code file, Binary executable.

Processor ID not Unique for all computers but remain unchanged. refernce

Motherboard ID can't be changed. reference

Title: Get unique Hardware id from PC

Body:
I tried getting Hard disk and Motherboard Serial Number from my PC. It works good in Windows 7 and Above

But same code in CMD does not working for Windows XP. It Shows O.E.M to be filled or Returns Nothing

wmic diskdrive get name,serialnumber,model // This is cmd to get serial num

In Windows XP It Returns Error for serialnumber

wmic baseboard get product,Manufacturer,version,serialnumber // This is cmd to get MotherBoard serialnumber

In Windows XP and Win 8  it returns in serialnumber Error like "To be filled by O.E.M"

Am looking for Best Pc Unique Id , which can return id or serialnumber for any OS and should be unique..

Please help me

Thank You.

Body:
Remember Mac address and Volume serial can be change. Hence hardware will have unpredictable changes.

So use Processor and Motherboard ID so that hardware ID never changes.

So on these basis, you could modify @Mederic code as below:

'Get the MotherBoard ID
    Function GetMotherBoardID() As String
        Dim query As New SelectQuery("Win32_BaseBoard")
        Dim search As New ManagementObjectSearcher(query)
        For Each info As ManagementObject In search.Get()
            Return info("SerialNumber").ToString()
        Next
    End Function

'Get the Processor ID
    Function GetProcessorId() As String
        Dim query As New SelectQuery("Win32_processor")
        Dim search As New ManagementObjectSearcher(query)
        Dim info As ManagementObject
        For Each info In search.Get()
            Return info("processorId").ToString()
        Next
    End Function

' Generate Hash
    Function GenerateHash(ByVal input As String) As String
        Dim hash = New SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))
        Return String.Concat(hash.[Select](Function(b) b.ToString("x2")))
    End Function

'Now display Hardware ID
MessageBox.Show(GenerateHash(GetMotherBoardID() & GetProcessorId()))

Source code : Code file, Binary executable.

Processor ID not Unique for all computers but remain unchanged. refernce

Motherboard ID can't be changed. reference


问:
Running a container stops another container
I've created two basic MEAN stack apps with a common database (mongo db). I've also built docker for these apps.

Problem:

When i start a mean stack container(example-app-1) using

```<code>docker-compose up -d --build
</code>```

The container runs smoothly and I'm also able to hit the container and view my page locally.

When i try to start another mean stack container(example-app-2) using

```<code>docker-compose up -d --build
</code>```

my previous container is stopped and the current container works without any flaw.

Required:

I want both these containers to run simultaneously using a shared database. I need help in achieving this.

docker-compose.yml Example app -1

```<code>version: '3'

services:
  example_app_1:
    build:
      dockerfile: dockerfile
      context: ../../
    image: example_app_1:1.0.0

  backend:
    image: 'example_app_1:1.0.0'
    working_dir: /app/example_app_1/backend/example-app-1-api
    environment:
      - DB_URL=mongodb://172.17.0.1:27017/example_app_1
      - BACKEND_PORT=8888
      - BACKEND_IP=0.0.0.0
    restart: always
    ports:
      - '8888:8888'
    command: ['node', 'main.js']
    networks:
      - default
    expose:
      - 8888
  frontend:
    image: 'example_app_1:1.0.0'
    working_dir: /app/example_app_1/frontend/example_app_1
    ports:
      - '5200:5200'
    command: ['http-server', '-p', '5200', '-o', '/app/example_app_1/frontend/example-app-1']
    restart: always
    depends_on:
      - backend
networks:
  default:
    external:
      name: backend_network
</code>```

docker-compose.yml for Example app 2

```<code>version: '3'

services:
  example-app-2:
    build:
      dockerfile: dockerfile
      context: ../../
    image: example_app_2:1.0.0

  backend:
    image: 'example-app-2:1.0.0'
    working_dir: /app/example_app_2/backend/example-app-2-api
    environment:
      - DB_URL=mongodb://172.17.0.1:27017/example_app_2
      - BACKEND_PORT=3333
      - BACKEND_IP=0.0.0.0
    restart: always
    networks:
      - default
    ports:
      - '3333:3333'
    command: ['node', 'main.js']

    expose:
      - 3333
  frontend:
    image: 'example-app-2:1.0.0'
    working_dir: /app/example_app_2/frontend/example-app-2
    ports:
      - '4200:4200'
    command: ['http-server', '-p', '4200', '-o', '/app/example_app_2/frontend/example-app-2
    restart: always
    depends_on:
      - backend
networks:
  default:
    external:
      name: backend_network
</code>```

答:
docker-compose will create containers named project_service. The project, by default, comes from the last component of the directory. So when you start the second docker-compose, it will stop the containers with those names, and start new ones.

Either move these two docker-compose files to separate directories so the container names are different, or run docker-compose with --project-name flag containing separate project names so the containers can be started with different names.

Body:
I've created two basic MEAN stack apps with a common database (mongo db). I've also built docker for these apps.

Problem:

When i start a mean stack container(example-app-1) using

docker-compose up -d --build

The container runs smoothly and I'm also able to hit the container and view my page locally.

When i try to start another mean stack container(example-app-2) using

docker-compose up -d --build

my previous container is stopped and the current container works without any flaw.

Required:

I want both these containers to run simultaneously using a shared database. I need help in achieving this.

docker-compose.yml Example app -1

version: '3'

services:
  example_app_1:
    build:
      dockerfile: dockerfile
      context: ../../
    image: example_app_1:1.0.0

  backend:
    image: 'example_app_1:1.0.0'
    working_dir: /app/example_app_1/backend/example-app-1-api
    environment:
      - DB_URL=mongodb://172.17.0.1:27017/example_app_1
      - BACKEND_PORT=8888
      - BACKEND_IP=0.0.0.0
    restart: always
    ports:
      - '8888:8888'
    command: ['node', 'main.js']
    networks:
      - default
    expose:
      - 8888
  frontend:
    image: 'example_app_1:1.0.0'
    working_dir: /app/example_app_1/frontend/example_app_1
    ports:
      - '5200:5200'
    command: ['http-server', '-p', '5200', '-o', '/app/example_app_1/frontend/example-app-1']
    restart: always
    depends_on:
      - backend
networks:
  default:
    external:
      name: backend_network

docker-compose.yml for Example app 2

version: '3'

services:
  example-app-2:
    build:
      dockerfile: dockerfile
      context: ../../
    image: example_app_2:1.0.0

  backend:
    image: 'example-app-2:1.0.0'
    working_dir: /app/example_app_2/backend/example-app-2-api
    environment:
      - DB_URL=mongodb://172.17.0.1:27017/example_app_2
      - BACKEND_PORT=3333
      - BACKEND_IP=0.0.0.0
    restart: always
    networks:
      - default
    ports:
      - '3333:3333'
    command: ['node', 'main.js']

    expose:
      - 3333
  frontend:
    image: 'example-app-2:1.0.0'
    working_dir: /app/example_app_2/frontend/example-app-2
    ports:
      - '4200:4200'
    command: ['http-server', '-p', '4200', '-o', '/app/example_app_2/frontend/example-app-2
    restart: always
    depends_on:
      - backend
networks:
  default:
    external:
      name: backend_network


问:
How to fix the most common LazyInitializationException - Hibernate JPA
I'm struggling with LazyInitializationException. I've read so far literally every article about that, but unfortunately I didn't find solution for my problem. Many of those solutions using EntityManager or things which I don't using. I'm connecting with my DB via JPA.

I've got couple of entities, but the problem is just with two of them: Order and OrderDetails.
When I get from DB object Order, and then I'll try to do order.getOrderDetails() then I gettin following error:

Exception:

```<code>Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tradesystem.order.Order.orderDetails, could not initialize proxy - no Session
</code>```

but it works the other way around: from OrderDetails object I can get Order by objectDetail.getOrder() .
What's more: I can't use Eager loading due to fact that I'm using it in another entity.

Here's my Order class:

```<code>@Entity
@Data
@Table(name = "orders")
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long id;

private LocalDate date;

@OneToMany(mappedBy = "order")
private List<OrderDetails> orderDetails;

@ManyToOne
@JoinColumn(name = "buyer_fk")
private Buyer buyer;

@ManyToOne
@JoinColumn(name = "supplier_fk")
private Supplier supplier;
}
</code>```

OrderDao:

```<code>@Repository("orderDao")
public interface OrderDao extends JpaRepository<Order, Long> {

@Query(value = "SELECT * FROM orders " +
        "WHERE MONTH(orders.date) = ?1 AND YEAR(orders.date) = ?2",
        nativeQuery = true)
List<Order> getMonthOrders(int month, int year);
}
</code>```

and OrderDetails:

```<code>@Entity
@Data
@Table(name = "orderDetails")
public class OrderDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_details_id")
private Long id;

private BigDecimal quantity;

private BigDecimal sum;

@ManyToOne
@JoinColumn(name = "order_fk")
private Order order;

@ManyToOne
@JoinColumn(name = "product_fk")
private Product productType;

@OneToOne
@JoinColumn(name = "order_comment_fk")
private OrderComment orderComment;
}
</code>```

Relationship that finished with @Many is Lazy loaded by default, so why it doesn't load my OrderDetails when I doing .getOrderDetails() ?

I will be really gratefull for any help!
PS. I'm begginer, so if I didn't explain something enough good, don't hestitate to make some questions.

答:
Use this</p>

```<code>@Repository("orderDao")
public interface OrderDao extends JpaRepository<Order, Long> {

    @Query(value = "SELECT orders FROM Order orders LEFT JOIN FETCH orders.orderDetails " +
        "WHERE MONTH(orders.date) = ?1 AND YEAR(orders.date) = ?2")
    List<Order> getMonthOrders(int month, int year);
}
</code>```

Body:
I'm struggling with LazyInitializationException. I've read so far literally every article about that, but unfortunately I didn't find solution for my problem. Many of those solutions using EntityManager or things which I don't using. I'm connecting with my DB via JPA.

I've got couple of entities, but the problem is just with two of them: Order and OrderDetails.
When I get from DB object Order, and then I'll try to do order.getOrderDetails() then I gettin following error:

Exception:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tradesystem.order.Order.orderDetails, could not initialize proxy - no Session

but it works the other way around: from OrderDetails object I can get Order by objectDetail.getOrder() .
What's more: I can't use Eager loading due to fact that I'm using it in another entity.

Here's my Order class:

@Entity
@Data
@Table(name = "orders")
public class Order {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_id")
private Long id;

private LocalDate date;

@OneToMany(mappedBy = "order")
private List<OrderDetails> orderDetails;

@ManyToOne
@JoinColumn(name = "buyer_fk")
private Buyer buyer;

@ManyToOne
@JoinColumn(name = "supplier_fk")
private Supplier supplier;
}

OrderDao:

@Repository("orderDao")
public interface OrderDao extends JpaRepository<Order, Long> {

@Query(value = "SELECT * FROM orders " +
        "WHERE MONTH(orders.date) = ?1 AND YEAR(orders.date) = ?2",
        nativeQuery = true)
List<Order> getMonthOrders(int month, int year);
}

and OrderDetails:

@Entity
@Data
@Table(name = "orderDetails")
public class OrderDetails {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "order_details_id")
private Long id;

private BigDecimal quantity;

private BigDecimal sum;

@ManyToOne
@JoinColumn(name = "order_fk")
private Order order;

@ManyToOne
@JoinColumn(name = "product_fk")
private Product productType;

@OneToOne
@JoinColumn(name = "order_comment_fk")
private OrderComment orderComment;
}

Relationship that finished with @Many is Lazy loaded by default, so why it doesn't load my OrderDetails when I doing .getOrderDetails() ?

I will be really gratefull for any help!
PS. I'm begginer, so if I didn't explain something enough good, don't hestitate to make some questions.

Body:
Use this

@Repository("orderDao")
public interface OrderDao extends JpaRepository<Order, Long> {

    @Query(value = "SELECT orders FROM Order orders LEFT JOIN FETCH orders.orderDetails " +
        "WHERE MONTH(orders.date) = ?1 AND YEAR(orders.date) = ?2")
    List<Order> getMonthOrders(int month, int year);
}


问:
Instruct browser to only prompt for saving username/password when they have logged in successfully?
I noticed that some site would trigger the browser to prompt for saving username/password Only when they have logged in successfully.  How to achieve that?  response with HTTP 401 / 403 on error along side with the login form with error message?

Right now when I try logging in with invalid username/password, the server will redirect the browser back to the login form with some error message that indicates to the user that the username/password is incorrect, but the browser would ask if the client want to save the username/password which is inappropriate.

Thank you.

答: As far as I know, there's no standard way of doing this, although the topic comes up from time to time.</p>